Вверх Вниз


Модератор форума: 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? Пиши не в ЛС, а в эту тему.
Artem13  Offline Сообщение №61 написано: 21 Ноября 2012 в 09:09


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


2168
Demolir, посмотрел вики, со свойствами там достаточно просто - они создаются непосредственно в скрипте. Ни в коем случае не в событии. Т.е.

Code
ScriptName MyScript

int property MyProp auto

...

EndScript


А дальше используется как раньше - через ИД объекта-владельца. Т.е. скрипт с определением свойства должен быть прикреплён к ч.-л. - квесту, актору или объекту.

Добавлено (21.11.2012, 09:09)
---------------------------------------------
Кстати, а что за задача, для которой нужно

Quote (Demolir)
построить скрипт, который будет выполняться исключительно в режиме меню (если блоков GameMode и MenuMode больше не существует)?

Может можно обойтись предоставленными событиями.


Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
VIPerMX  Offline Сообщение №62 написано: 21 Ноября 2012 в 14:53



173
Доброго времени суток, помогите пожалуйста разобраться!

При компилировании выдает ошибку что нет функции Enable и IsEnabled. Что я делаю не так, или функция неправильно написана?!

Code
Scriptname SCRIPTNAME extends ObjectReference   

Static Property MyRef1 auto
MiscObject Property MyRef2 auto

Function OnActivate(ObjectReference akActionRef)

  if (MyRef1.IsEnabled())
   Debug.MessageBox("Сообщение")

  else
   if (Game.GetPlayer().GetItemCount(MyRef2) >= 6)
    MyRef1.Enable()
    Game.GetPlayer().RemoveItem(MyRef2, 6, false)
     Debug.MessageBox("Сообщение")   
           
   else
     if (Game.GetPlayer().GetItemCount(MyRef2) < 6)
                  Debug.MessageBox("Сообщение")
           endif
   endif
  endif

endfunction

Artem13  Offline Сообщение №63 написано: 21 Ноября 2012 в 15:32 | Отредактировано: Artem13 - Среда, 21 Ноября 2012, 15:33


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


2168
VIPerMX, хм, а точно OnActivate - это Function, а не Event ? См. четвёртый пример в шапке темы.
Ну и попробуй просто скобки убрать. Т.е. сделать не Enable(), а Enable


Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
VIPerMX  Offline Сообщение №64 написано: 21 Ноября 2012 в 16:31 | Отредактировано: VIPerMX - Среда, 21 Ноября 2012, 17:12



173
Quote (Artem13)
VIPerMX, хм, а точно OnActivate - это Function, а не Event ? См. четвёртый пример в шапке темы. Ну и попробуй просто скобки убрать. Т.е. сделать не Enable(), а Enable


На функцию и евент ругается одинаково, а если убрать скобки, так и вовсе, орет что нет значения! Странно, точно так же было на вики по CK один в один Enable и IsEnabled. Может тут тоже им надо присваивать значения, как с предметами?!

[EDIT]- Видимо я что-то напортачил, поставил ещё раз евент и все дейтвительно заработало =) Спасибо. И вот ещё вопрос, как сделать так, чтоб мой MyRef1 дизейблился сам через определенное время?!

Artem13  Offline Сообщение №65 написано: 21 Ноября 2012 в 17:58


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


2168
VIPerMX, только скриптом, вестимо. Если это именно Reference ID, то, няп, нужно создавать квест, к которому прикрепляется скрипт, отсчитывающий время и задизэйбливающий этот ИД.


Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Demolir  Offline Сообщение №66 написано: 21 Ноября 2012 в 18:33



420
VIPerMX, по первому вопросу вот так:

Code
Scriptname AAActivscript extends ObjectReference   

import Game
import Debug

ObjectReference Property MyRef1 auto  
MiscObject Property MyRef2 auto  

Event OnActivate(ObjectReference akActionRef)

   if MyRef1.IsEnabled()
       MessageBox("Сообщение")  
    elseif  (GetPlayer().GetItemCount(MyRef2) >= 6)  
       MyRef1.Enable()
       GetPlayer().RemoveItem(MyRef2, 6)  
       MessageBox("Сообщение")               
    elseif (GetPlayer().GetItemCount(MyRef2) < 6)  
       MessageBox("Сообщение")  
    endif  

endEvent


по второму вопросу - используйте регистратор в квестовом скрипте RegisterForSingleUpdate(), им можно значительно задержать исполнение скрипта.

Не судите, да не судимы будите...
VIPerMX  Offline Сообщение №67 написано: 21 Ноября 2012 в 19:31



173
Quote (Demolir)
по второму вопросу - используйте регистратор в квестовом скрипте RegisterForSingleUpdate(), им можно значительно задержать исполнение скрипта.


Спасибо большое, с первым я разобрался вроде как, кстатиа что значит import Game и import Debug?! А на счет второго, можно поподробнее, а то я недавно только со скриптами работаю. Я так понимаю надо создать квест а в него запилить скрипт?!

Artem13  Offline Сообщение №68 написано: 21 Ноября 2012 в 21:58


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


2168
Quote (VIPerMX)
кстатиа что значит import Game и import Debug

няп, эти команды подключают к файлу библиотеки функций Game и Debug соответственно. Иначе компилятор просто не поймёт, что за функцию (стандартную) ты использовал. Если функции из этих библиотек не используются, можно смело убить эти строки. Если используется такая функция только раз и в одном месте, теоретически можно использовать вызов вида Game.FunctionName (FunctionName - имя вызываемой функции библиотеки Game)


Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
VIPerMX  Offline Сообщение №69 написано: 22 Ноября 2012 в 00:45 | Отредактировано: VIPerMX - Четверг, 22 Ноября 2012, 01:35



173
Artem13- Спасибо за разьеснение =) А какие функции, если не секрет нуждаются в библиотечном include?

Quote (VIPerMX)
по второму вопросу - используйте регистратор в квестовом скрипте RegisterForSingleUpdate(), им можно значительно задержать исполнение скрипта.


Все оказалось ещё куда проще, поставил в конце скрипта
Utility.Wait(900)
MyRef1.Disable()

и все, через 15 минут реального времени действие можно повторить заного!

[EDIT] Не подскажите пожалуйста скрипт, как сделать двери, открывающиеся только по трайгеру, без взаимодействия через "Е"

Demolir  Offline Сообщение №70 написано: 22 Ноября 2012 в 11:13 | Отредактировано: Demolir - Четверг, 22 Ноября 2012, 11:25



420
Quote (VIPerMX)
Utility.Wait(900)

Utility - тот же вид импортируемого модуля, что и Game, Debug. Т.е если использовать команду импорта import Utility, то поставлять ее в функции уже не надо. Это удобно, в основном, когда приходится использовать ее несколько раз в одном скрипте.
Quote (VIPerMX)
А на счет второго, можно поподробнее,

RegisterForSingleUpdate() - это одноразовое срабатывание события, а чтобы сделать цикл, надо в самом конце события OnUpdate прописывать RegisterForSingleUpdate(), тогда следующее событие запустится только после окончания предыдущего (через установленное время)...Хотя тут вижу вопрос уже решен иначе, и квестовый скрипт не требуется. ;)

Добавлено (22.11.2012, 11:13)
---------------------------------------------
Quote (VIPerMX)
Не подскажите пожалуйста скрипт, как сделать двери, открывающиеся только по трайгеру, без взаимодействия через "Е"

Не совсем понял вопрос. В смысле, чтобы при подходе к двери срабатывал триггер-бокс и дверь сама открывалась? И что значит открывалась - открытие замка, или визуальное открытие двери?

Вообщем, если используется триггер-бокс, то можно проверить такую конструкцию:

Code
Scriptname AAOpenDoorScript extends ObjectReference    

import Game
objectReference Property MyDoor auto

event onTriggerEnter(objectReference triggerRef)
     if (triggerRef  == getplayer())
                ; тут с MyDoor что-то происходит, какое-то там открытие
                endif
endEvent

Не судите, да не судимы будите...
VIPerMX  Offline Сообщение №71 написано: 22 Ноября 2012 в 11:37 | Отредактировано: VIPerMX - Четверг, 22 Ноября 2012, 11:42



173
Demolir, Спасибо большое за некоторые пояснения. С дверьми я справился, просто забыл поставить онтрайггер и долго не мог понять что не так =) У меня похожий скрипт, я ещё добавил в него БлокАктивейшен, чтоб не позволить игроку взаимодейстовавать с дверью напрямую!

Вообще заметил особеность, пока я жду ответа на форуме до всего дохожу сам =)

Demolir  Offline Сообщение №72 написано: 22 Ноября 2012 в 12:02



420
Quote (VIPerMX)
до всего дохожу сам =)

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

Не судите, да не судимы будите...
ArcherL  Offline Сообщение №73 написано: 23 Ноября 2012 в 17:06 | Отредактировано: ArcherL - Пятница, 23 Ноября 2012, 17:19


Странник


36
Как сделать бесконечный цикл? Так же как и в C++ или по другому?

Demolir  Offline Сообщение №74 написано: 24 Ноября 2012 в 03:06 | Отредактировано: Demolir - Суббота, 24 Ноября 2012, 03:10



420
Insomniac, поподробнее. Точнее, при каких событиях/условиях это должно происходить, т.е. активация, маг.эффект, триггер?

Добавлено (24.11.2012, 03:06)
---------------------------------------------
Quote (ArcherL)
Как сделать бесконечный цикл?

Можно использовать для этого команду регистрации RegisterForSingleUpdate() с заданным значением Integer. Правда события с частотой менее 0.5 сек плохо обрабатываются игрой, часто накладываются друг на друга. Что сделать - особенность папируса...


Не судите, да не судимы будите...
Arkan000  Offline Сообщение №75 написано: 04 Декабря 2012 в 16:40


Странник


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

Myprism  Offline Сообщение №76 написано: 04 Декабря 2012 в 20:59


Физик


1437
Arkan000, мне кажется, надо просто посмотреть, как это сделано в том моде, и сделать так же. В крайнем случае, взять того персонажа и переделать на свой вкус. Если есть образец - то это наилучший путь, чтобы научиться делать так же.

Arkan000  Offline Сообщение №77 написано: 04 Декабря 2012 в 21:31


Странник


14
Quote (Myprism)
мне кажется, надо просто посмотреть, как это сделано в том моде

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

Myprism  Offline Сообщение №78 написано: 04 Декабря 2012 в 22:05


Физик


1437
Arkan000, Грамотный мододел всем своим нововведениям даёт одинаковые приставки по которым их легко найти. Кроме того, редактор помечает звёздочкой каждый изменённый модом объект.

Artem13  Offline Сообщение №79 написано: 04 Декабря 2012 в 22:09


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


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


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


Странник


14
Quote (Artem13)
Грамотный мододел всем своим нововведениям даёт одинаковые приставки по которым их легко найти. Кроме того, редактор помечает звёздочкой каждый изменённый модом объект.

Quote (Artem13)
Не майтесь дурью, загрузите мод в Tes5Edit, и там всё прекрасно видно - в разделе загруженного плагина будут только те объекты, что изменил или добавил этот плагин. Данный редактор - первое средство для изучения чужих трудов

Спасибо друзья, вы мне очень помогли! good

Artem13  Offline Сообщение №81 написано: 05 Декабря 2012 в 12:48


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


2168
Arkan000, только первая цитата не моя ;)


Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
VIPerMX  Offline Сообщение №82 написано: 10 Декабря 2012 в 16:04 | Отредактировано: VIPerMX - Понедельник, 10 Декабря 2012, 16:22



173
Такой вот вопрос. Есть скрипт, который кастует на игрока бафф. Я повесли скрипт на стул, и хочу сделать так, чтоб скрипт активировался только в том случае, если игрок сидит на этом стуле. В скрипте есть Утилити вайт, т.е. игрок садиться, ждет 30 секунд, а на него кастуется бафф. Но беда в том, что если игрок слезет со стула, не дождавшись каста, каст все ровно поставиться!

Code
Scriptname VIPERMX_BassBuffScript extends ObjectReference  Conditional     

Spell Property BassBuff  Auto      
Message Property BuffMessage  Auto       
ObjectReference Property Bench  Auto     

Event OnActivate(ObjectReference akActionRef)

Utility.Wait(30.0)

     if akActionRef == Game.GetPlayer()     
      elseif Bench.IsFurnitureMarkerInUse(0, true)  <=========
      BassBuff.Cast(akActionRef, akActionRef)
      BuffMessage.Show()
     endif

EndEvent


В обще вот скрипт, стрелочкой я выделил то, что меня интересует - скрипт компилируется но работать не хочет, при использовании фурнитура ничего не происходит вообще!

Второй вопрос, можно ли сделать в скрипте пропуск дней. что-то вроде гаснет экран и в игре проходит несколько дней!

Demolir  Offline Сообщение №83 написано: 10 Декабря 2012 в 18:05 | Отредактировано: Demolir - Понедельник, 10 Декабря 2012, 18:12



420
Quote (VIPerMX)
скрипт компилируется но работать не хочет, при использовании фурнитура ничего не происходит вообще!

Операция "или" (Elseif) тут не нужна, т.к. производится проверка и на актера и на использование маркера. И непонятно - зачем в функции каста дважды указывается цель? Вообщем:

Code

        if akActionRef == Game.GetPlayer()  
           if Bench.IsFurnitureMarkerInUse(0, true)        
               ; ба-бах
           endif
        endif

; либо так

        if (akActionRef == Game.GetPlayer())  &&  (Bench.IsFurnitureMarkerInUse(0, true))        
               ; ба-бах
        endif

Не судите, да не судимы будите...
VIPerMX  Offline Сообщение №84 написано: 10 Декабря 2012 в 18:46



173
Quote (Demolir)
Операция "или" (Elseif) тут не нужна, т.к. производится проверка и на актера и на использование маркера.


Вот я дурной, чет я совсем забыл про анд. Бывает =))) Спасибо все работает как надо!

Quote (Demolir)
И непонятно - зачем в функции каста дважды указывается цель?


Не знаю, я так у бетседки подглядел!

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

Demolir  Offline Сообщение №85 написано: 10 Декабря 2012 в 19:37



420
Quote (VIPerMX)
можно ли сделать в скрипте пропуск дней. что-то вроде гаснет экран и в игре проходит несколько дней!

На счет пропуска дней не знаю, а пропуск часов точно можно. Это даже не совсем "пропуск", скорее глобальная установка счетчика часов/дней в определенное значение. Собственно попробовать так же использовать и переменную GameDay:

GlobalVariable Property GameDay auto
float Pass = GameDay.GetValue()

Pass += 2
GameDay.SetValue(Pass)

А на счет визуализации можно использовать ImageSpaceModifier

Не судите, да не судимы будите...
VIPerMX  Offline Сообщение №86 написано: 11 Декабря 2012 в 01:50 | Отредактировано: VIPerMX - Вторник, 11 Декабря 2012, 02:52



173
Quote (Demolir)
На счет пропуска дней не знаю, а пропуск часов точно можно. Это даже не совсем "пропуск", скорее глобальная установка счетчика часов/дней в определенное значение. Собственно попробовать так же использовать и переменную GameDay:


И ещё раз спасибо. Все работает как надо. На счет эффекта, мне он собственно и не понадобиться, так как с пропуском у меня игрок телепортится из одной локации в другую! Так что, присутствует экран загрузки, и пропуск времени выглядит более естественным!
И опять вопросы! Можно ли в Debug.MessageBox выравнивать текст по сторонам, или переходить на новую строчку, типо как в хтмл <p> <center> и т.д.

Demolir  Offline Сообщение №87 написано: 11 Декабря 2012 в 17:44



420
Quote (VIPerMX)
Можно ли в Debug.MessageBox выравнивать текст по сторонам, или переходить на новую строчку, типо как в хтмл <p> <center> и т.д.

Так можно делать только в игровых книгах (ставить тэги), но не в библиотеках Debug. Кое-какие тэги можно использовать в текстах сообщений MessageID.Show(), но там вроде только строковые и числовые значения принимаются, но не отступы, пробелы и т.д. По крайней мере, я не видел.

Не судите, да не судимы будите...
VIPerMX  Offline Сообщение №88 написано: 18 Декабря 2012 в 13:09



173
И снова я. В общем, какая нужна функция, чтоб quest objectives ставился в статус complited только в том случае, если определенный предмет лежит в инвентаре игрока. но когда игрок его скидывает Quest Objectiv сбрасывался. (надеюсь понятно)

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

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



1213
Quote (VIPerMX)
И снова я. В общем, какая нужна функция, чтоб quest objectives ставился в статус complited только в том случае, если определенный предмет лежит в инвентаре игрока. но когда игрок его скидывает Quest Objectiv сбрасывался. (надеюсь понятно)

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


Вот два варианта. Не факт, что они лучшие :) Может, кто-то придумает что-то проще...

1. Если каждый из этих предметов уникальный и создан тобой лично, можно к ним прецепить скрипт такого типа:
Code
Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) ;при смете контэйнера
     If akNewContainer == Game.GetPlayer()
       ;установить обджэктив в комплитэд. проверить, собраны ли все предметы. если собраны, сменить стадию на "всё собрано".
     Else
       ;снять комплитэд. сменить стадию на "не всё собрано".
     EndIf
EndEvent


2. Более универсальный вариант. Отслеживаются любые изменения инвентаря игрока. Скрипт цепляется к игроку.
Code
Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer)
     ;если предмет в твоём списке, установить коплитэд. Сменить стадию, если нужно.
EndEvent

Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
     ;если предмет в твоём списке, снять коплитэд. Сменить стадию, если нужно.
EndEvent


Вот. Ну это так, примитивненько... Может, сейчас кто-то с меня посмеется и расскажет, как это надо делать.
Если нужны совсем полные скрипты, пиши в пм.

VIPerMX  Offline Сообщение №90 написано: 18 Декабря 2012 в 14:39



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

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

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