Вверх Вниз


Модератор форума: Kris†a™  
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Вопросы по скриптам Papyrus
sansuli  Offline Сообщение №1 написано: 31 Августа 2012 в 17:29 | Отредактировано: sansuli - Пятница, 17 Апреля 2015, 21:08


The Red Sun


194
Уроки по скриптованию на языке Papyrus
Прежде чем задать вопрос просмотрите вышеуказанные уроки.
ok

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Dsion  Offline Сообщение №91 написано: 18 Декабря 2012 в 14:45 | Отредактировано: Dsion - Вторник, 18 Декабря 2012, 14:47



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

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


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

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

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



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

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

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

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



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

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

VIPerMX  Offline Сообщение №94 написано: 18 Декабря 2012 в 15:22



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


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

Dsion  Offline Сообщение №95 написано: 18 Декабря 2012 в 15:27



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

VIPerMX  Offline Сообщение №96 написано: 18 Декабря 2012 в 16:03



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


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

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

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



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

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

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

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

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



173
Quote (Dsion)
Действительно... Странно...


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

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

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



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

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

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

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



173
Quote (Dsion)
Ну а как же... Берешь предмет: высвечивается "Найти предмет #1: выполнено". Удаляешь предмет: появляется "Найти предмет #1"... Или тебе надо, чтоб не было такого? Может, к черту вообще objective'ы? Например, npc говорит "собери мне то и то". А когда ты с ним говоришь в следующий раз, он единоразово проверяет, есть ли у тебя всё необходимое. Если есть, забирает и дает награду...


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

На счет упрощенного варианта, об этом я уже думал. =) Просто хотел все красиво сделать. В принципе, наверное можно и без этого все сделать!
В принципе, можно и не делать удаляющиеся логи, нашел и все, а если выкинул - сам виноват, ибо потом предметы все понадобятся!

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


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

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



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

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



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

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



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

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

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



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

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



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

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

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



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

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

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



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


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

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

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

stel  Offline Сообщение №107 написано: 02 Января 2013 в 02:16 | Отредактировано: stel - Среда, 02 Января 2013, 02: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 написано: 02 Января 2013 в 03:18 | Отредактировано: Demolir - Среда, 02 Января 2013, 18:08



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

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

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

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

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


Странник


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

Artem13  Offline Сообщение №110 написано: 03 Января 2013 в 13:58


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


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

Код

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


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


Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Demolir  Offline Сообщение №111 написано: 03 Января 2013 в 15: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 написано: 03 Января 2013 в 16:45


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


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


Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Demolir  Offline Сообщение №113 написано: 04 Января 2013 в 05:58



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

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

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


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


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


Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
stel  Offline Сообщение №115 написано: 05 Января 2013 в 01:24


Странник


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

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


СУЗИ


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

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

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




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


Жаждущий


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

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 в 18: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 написано: 23 Января 2013 в 00:35


СУЗИ


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



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


Жаждущий


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

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