Модератор форума: 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  Сообщение №91 написано: 18 декабря 2012, 10:45 | Отредактировано: Dsion - 18 декабря 2012, 10:47



Цитата VIPerMX

Да, как-то все сложно, я думал скрипт на квест вешать.
В том то все и дело, что предметы ванильные, и не хочется их скриптами портить, иначе конфликтов будет немерено!

Меня интересует куда больше Quest Objectives. Закончить все понят поставить set completed. А вот как их вернуть назад?! Что они ещё не выполнены?! Хм, посмотрю на примеру собирания шкур!



MyQuest.SetObjectiveCompleted(10, false) - Вот так снимается флаг "выполнено" =)
Если предметы ванильные, то 2й вариант подойдет. А скрипт вешается на Алиас игрока. Никаких проблем и конфликтов не будет...

Ну если нужно прицепить скрипт именно к квесту, можно сделать через з... более хитро. Скажем, каждые 5 секунд идет проверка инвентаря игрока и установка/снятие нужных флагов...

VIPerMX  Offline  Сообщение №92 написано: 18 декабря 2012, 10:55 | Отредактировано: VIPerMX - 18 декабря 2012, 10:56



173
Цитата Dsion

MyQuest.SetObjectiveCompleted(10, false) - Вот так снимается флаг "выполнено" =)


Аааа, а вот это уже другое дело =) В общем сделаю в квест алиаса плеера и на него повешу скрипт, если вещь есть, то сет комплитед, если нет, сет комплитед фолс =)

Да, только на какую функцию это повесить?! На сброс или поднятие предмета?!

Dsion  Offline  Сообщение №93 написано: 18 декабря 2012, 10:59 | Отредактировано: Dsion - 18 декабря 2012, 11:16



Ага. Для алиаса там два ивента тебе понадобятся:

OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) - что-то попало в инвентарь
OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer) - что-то ушло из инвентаря

VIPerMX  Offline  Сообщение №94 написано: 18 декабря 2012, 11:22



173
Цитата Dsion

Ага. Для алиаса там два ивента тебе понадобятся: OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) - что-то попало в инвентарь OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer) - что-то ушло из инвентаря Если что не выйдет, пиши. Я тогда полный скрипт сброшу...



В общем буду пробовать. Спасибо большое

Dsion  Offline  Сообщение №95 написано: 18 декабря 2012, 11:27



Давай... Если предметы ванильные, не забудь проверить инвентарь в момент старта квеста... Вдруг они там уже есть.

VIPerMX  Offline  Сообщение №96 написано: 18 декабря 2012, 12:03



173
Цитата Dsion

Давай... Если предметы ванильные, не забудь проверить инвентарь в момент старта квеста... Вдруг они там уже есть.



А как это сделать?

В общем, ситуация такая - MyQuest.SetObjectiveCompleted(10, false) вообще удаляет лог из дневника

Dsion  Offline  Сообщение №97 написано: 18 декабря 2012, 13:06 | Отредактировано: Dsion - 18 декабря 2012, 13:11



Цитата VIPerMX

В общем, ситуация такая - MyQuest.SetObjectiveCompleted(10, false) вообще удаляет лог из дневника


Действительно... Странно...
Можно, конечно, сделать вот так (работает):

Code
SetObjectiveCompleted(20, false)
SetObjectiveDisplayed(20, abForce = true)

Но как-то это странно...

VIPerMX  Offline  Сообщение №98 написано: 18 декабря 2012, 13:10 | Отредактировано: VIPerMX - 18 декабря 2012, 13:11



173
Цитата Dsion

Действительно... Странно...



А если дисплеет фолс, тоже удаляться логи?!

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

Dsion  Offline  Сообщение №99 написано: 18 декабря 2012, 13:16 | Отредактировано: Dsion - 18 декабря 2012, 13:27



Цитата VIPerMX

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


Ну а как же... Берешь предмет: высвечивается "Найти предмет #1: выполнено". Удаляешь предмет: появляется "Найти предмет #1"... Или тебе надо, чтоб не было такого?

Может, к черту вообще objective'ы? Например, npc говорит "собери мне то и то". А когда ты с ним говоришь в следующий раз, он единоразово проверяет, есть ли у тебя всё необходимое. Если есть, забирает и дает награду...

VIPerMX  Offline  Сообщение №100 написано: 18 декабря 2012, 13:52 | Отредактировано: VIPerMX - 18 декабря 2012, 13:59



173
Цитата Dsion

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



Как это сделать, я просто не знаю =)

Dsion  Offline  Сообщение №101 написано: 18 декабря 2012, 15:18 | Отредактировано: Dsion - 18 декабря 2012, 15:25



Цитата VIPerMX

Как это сделать, я просто не знаю =)


Ладно. Сейчас придут профи и засмеют меня, наверное... Но я бы это всё сделал где-то так:



Но я этого не проверял и 80% вероятность, что оно не работает.
Еще функцию UpdateQuestState() надо выполнить при старте квеста. Вдруг у игрока уже всё есть?

Demolir  Offline  Сообщение №102 написано: 18 декабря 2012, 16:57 | Отредактировано: Demolir - 18 декабря 2012, 17:06



420
Цитата VIPerMX

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


А что мешает взять за основу аналогичный дефолтный квест, например, по по сбору камней Берензии? Там как раз выполняются все эти условия. Кроме квеста на камни, есть еще и другие, подобные. Там все работает как нужно, т.е. взял предмет - получил SetObjective "У вас есть 1 предмет", выбрасываешь - SetObjective "У вас есть 0 предмет". Даже если игрок наберет нужное количество предметов (квест обновится), а потом решит выбросить что-то, чтобы не было ошибки - выставить дополнительное условие в диалоге, или в скрипте, или "где-там-еще" - обновление не только при условии GetStage(), но и при GetPlayer().GetItemCount(Object) >= 5 (т.е. должно быть 5 предметов Object в инвентаре у игрока).

Не судите, да не судимы будите...
Dsion  Offline  Сообщение №103 написано: 18 декабря 2012, 18:02



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

VIPerMX  Offline  Сообщение №104 написано: 18 декабря 2012, 22:02 | Отредактировано: VIPerMX - 19 декабря 2012, 00:17



173
С тем учетом. как себя любят скрипты в Скайриме вести, даже и не знаю... стоит ли это ради пятиминутного квеста то?! Я подумаю как я вообще хочу дальше реализовать квес., если получиться идея задуманная, то можно будет реализовать проще. Не сильно запариваясь в скриптах!

Можно ли сделать так, чтоб игрок мог активировать трайгер, положив в него определенный предмет (посредством хавока, зажатой Е) ?!
Мне кажется, я где-то видел этот вопрос уже то ли тут, то ли ещё где!

Dsion  Offline  Сообщение №105 написано: 19 декабря 2012, 08:45 | Отредактировано: Dsion - 19 декабря 2012, 08:48



Цитата VIPerMX

Можно ли сделать так, чтоб игрок мог активировать трайгер, положив в него определенный предмет (посредством хавока, зажатой Е) ?!


Можно...
Но не для тех, кто боится скриптов, длиннее двух строчек :) Не в обиду...

VIPerMX  Offline  Сообщение №106 написано: 19 декабря 2012, 10:02 | Отредактировано: VIPerMX - 19 декабря 2012, 10:10



173
Цитата Dsion

Можно... Но не для тех, кто боится скриптов, длиннее двух строчек Не в обиду...



Да я вроде не боюсь... я недавно этим занимаюсь, и очень много попросту не знаю! А что бы создать что-то более интересное чем "сходи убей Вора и принеси амулет", надо больше практики и знаний.

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

Давай я попробую ваш оптимизированный скрипт.

stel  Offline  Сообщение №107 написано: 1 января 2013, 22:16 | Отредактировано: stel - 1 января 2013, 22:21



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

Вот ссылка на скрин с краказяброй.
http://piccy.info/view3/3923189/abf94f24b35e2e0c3e98be902f7945ee/

Небольшой кусок кода с выводом этой строки (строк)

if Quality <= 55
Debug.Notification(" Запах как от " + RaceString + " " + SexString + " от такой крови меня стошнит! (Качество: " + (Quality as INT) + "%)")
elseif Quality <= 65 && Quality > 55
Debug.Notification(" Эта вонь " + RaceString + " " + SexString + " плохой крови. (Качества: " + (Quality as INT) + "%)")
elseif Quality <= 75 && Quality > 65
Debug.Notification(" Не представляю себя пьющим кровь этого " + RaceString + " " + SexString + " (Качества: " + (Quality as INT) + "%)")
elseif Quality <= 85 && Quality > 75
Debug.Notification(" Мысли что я пью кровь этого " + RaceString + " " + SexString + " меня сейчас стошнит. (Качества: " + (Quality as INT) + "%)")
elseif Quality <= 95 && Quality > 85
Debug.Notification(" Запах крови " + RaceString + " " + SexString + " не сильно приятный. (Качества: " + (Quality as INT) + "%)")
elseif Quality > 95 && Quality < 105
Debug.Notification(" Кровь " + RaceString + " " + SexString + " имеет некий слабый привкус. (Качества: " + (Quality as INT) + "%)")
elseif Quality >= 105 && Quality < 115
Debug.Notification(" Эта кровь " + RaceString + " " + SexString + "'не так уж и плоха. (Качества: " + (Quality as INT) + "%)")
elseif Quality >= 115 && Quality < 125
Debug.Notification(" Запах крови этого " + RaceString + " " + SexString + " очень даже ничего. (Качества: " + (Quality as INT) + "%)")
elseif Quality >= 125 && Quality < 135
Debug.Notification(" Жду недождусь пока вопьюсь в шею " + RaceString + " " + SexString + " (Качества: " + (Quality as INT) + "%)")
elseif Quality >= 135 && Quality < 145
Debug.Notification(" Вкус этой крови " + RaceString + " " + SexString + " само удовольствие (Качества: " + (Quality as INT) + "%)")
elseif Quality >= 145
Debug.Notification(" Немогу определить запах крови " + RaceString + " " + SexString + " . Он такой как все! (Качества: " + (Quality as INT) + "%)")
endif

Добавлено (02.01.2013, 02:16)
---------------------------------------------
После многих попыток я выяснил если удалить RaceString все становистя нормально. Вот эта функция

RaceString = akTarget.GetLeveledActorBase().GetRace().GetName()

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

Demolir  Offline  Сообщение №108 написано: 1 января 2013, 23:18 | Отредактировано: Demolir - 2 января 2013, 14:08



420
Цитата stel

Может кто подсказать может существет другой способ узнать название рассы и выдать ее название?


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

Неудачные попытки исправить:
- замена Notification на MessageBox
- перевод текста уведомления в данные String. Т.е. Debug.Notification(TextString+...+...)
- смена языковой раскладки клавиатуры (собственно заранее знал, что дело не в этом))
Хотя и сомнительно, что дело тут в редакторе, но если не получится решить проблему с его помощью, то такие моды скорее всего придется браковать в будущем, либо оставлять подобные уведомления без перевода. Мало кто захочет править исходники файлов игры, или проводить некие сомнительные операции, только для того чтобы у него корректно заработал какой-то 1 мод.

Вообщем, конкретный ответ пока не нашел. Возможно кто-то отпишется, кто знает решение.

Не судите, да не судимы будите...
stel  Offline  Сообщение №109 написано: 2 января 2013, 10:20



10
Пичальные новости...

Artem13  Offline  Сообщение №110 написано: 3 января 2013, 09:58


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


stel, попробуй такой финт ушами:

Код

RaceID= akTarget.GetLeveledActorBase().GetRace()
if RaceID == 1
     RaceString = "Норд"
elseif ...
...
endif


Т.е. фактически сформировать название расы прямо указанной строкой на основе её, расы, ИД. Только надо ИД рас выяснить, я 1 нордам присвоил" от фонаря".

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



420
Нет, строковые данные вообще отказываются работать с кириллицей. Попробовал "вывернуться" таким образом:

Message Property MenuMessage Auto
MiscObject Property flForm Auto

Event OnActivate(ObjectReference ackSource)
ArMenu()
endevent

Function ArMenu(Int imess)
string Fname = flForm.getname()
imess = MenuMessage.Show(Fname)
utility.WaitMenuMode(0.3)
EndFunction

То же самое. Кракозябры рулят.

Не судите, да не судимы будите...
Artem13  Offline  Сообщение №112 написано: 3 января 2013, 12:45


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


Demolir, заметь, ты опять пытался присвоить строковой переменной результат функции. А прямая запись точно также себя ведёт?

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



420
Цитата Artem13

А прямая запись точно также себя ведёт?


Так в том то и дело, что строковые данные как раз отображаются в уведомлениях, но не отображается текст самого уведомления Т.е если использовать Debug.Notification(" Вкус этой крови " + RaceString +....) , то данные RaceString читаются на русском, а " Вкус этой крови " идет кракозябрами.
Я в прошлом примере попробовал использовать для этого не библиотеку Debug, а непосредственно сообщение Message, в надежде, что это что-то изменит :(

Не судите, да не судимы будите...
Artem13  Offline  Сообщение №114 написано: 4 января 2013, 15:13


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


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

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



10
Я немного извернулся разбил строку на двегде транслитом набрал (Paca - RaceString) и остпльное во вторую, только так.

Snakesalamandra  Offline  Сообщение №116 написано: 19 января 2013, 17:08


СУЗИ


295
Народ кто нибудь может вкраце обьяснить мне азы работы со скриптами я только начал разбираться с СК а в скриптах вообще НОЛЬ !буду очень благодарен за это.

Добавлено (12.01.2013, 23:16)
---------------------------------------------
Вот у меня вопрос после того как посмотрел мод Forgotten mastery в игре там есть некоторые заклинания которые создают в небе сферу стреляющую лучами света или молниями не подсакжете-ли как выглядит скрипт обеспечивающий такой еффект если подскажете буду очень благодарен.

Добавлено (19.01.2013, 21:08)
---------------------------------------------
Помогите со скриптами оч надо!




Играю в Mass Effect 3, пишите в ЛС поиграем вместе!
slastik  Offline  Сообщение №117 написано: 20 января 2013, 10:46


Жаждущий


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

Scriptname [имя скрипта] extends ObjectReference

Event OnActivate(ObjectReference AkActionRef)
If akActionRef == Game.GetPlayer()
[удаленный контейнер].Activate(Game.GetPlayer(), True)
Else
EndIf
EndEvent

ObjectReference Property [удаленный контейнер] Auto


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

- Что это за горы стоят?
- А, это орки бегут!
Sabira  Сообщение №118 написано: 21 января 2013, 14:32

slastik, Укажите на конкретный объект. К примеру вот так:

Указываем в качестве родителя ObjectReference, «расширяя» этим его свойства. Мы можем указать и другого родителя (например, Form, Actor, Activator), но в данном случае мы хотим приобрести свойства именно ObjectReference. После этого нам станут доступны функции, описанные в родительском объекте, например:

Function Activate (ObjectReference akActivator)
Function AddItem (Form akItemToAdd, int aiCount, bool abSilent)
Function Disable (bool abFadeOut), которые указаны в ObjectReference.

Snakesalamandra  Offline  Сообщение №119 написано: 22 января 2013, 20:35


СУЗИ


295
Вот у меня вопрос может скриптеры опытные знают как сделать так чтобы заклинание например наносяшее урон ядом в течении 10 сек после истечения 10 сек еффект перебросился на ближайшую цель или после смерти врага он перебролсился на ближ цель!подскажите кто знает пожалуйста!



Играю в Mass Effect 3, пишите в ЛС поиграем вместе!
slastik  Offline  Сообщение №120 написано: 29 января 2013, 17:47


Жаждущий


209
Подскажите, как просмотреть содержимое скрипта, который имеет только файл с расширением "pex". В СК он не открывается, а файла "psc" с ним нет. Может есть отдельные приложения для просмотра/редактирования скриптов?

- Что это за горы стоят?
- А, это орки бегут!
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Поиск:





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