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


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


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

Code
ScriptName MyScript

int property MyProp auto

...

EndScript


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

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

Цитата Demolir

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


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

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


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


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

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



173
Цитата Artem13

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



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

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

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


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


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

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



173
Цитата Demolir

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



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

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


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


Цитата VIPerMX

кстатиа что значит import Game и import Debug


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

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



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

Цитата VIPerMX

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



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

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

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

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



420
Цитата 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, 07:37 | Отредактировано: VIPerMX - 22 ноября 2012, 07:42



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

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

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



420
Цитата VIPerMX

до всего дохожу сам =)


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

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



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

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



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

Добавлено (24.11.2012, 03:06)
---------------------------------------------
Цитата ArcherL

Как сделать бесконечный цикл?


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


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



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

Myprism  Offline  Сообщение №76 написано: 4 декабря 2012, 16:59


Физик


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

Arkan000  Offline  Сообщение №77 написано: 4 декабря 2012, 17:31



14
Цитата Myprism

мне кажется, надо просто посмотреть, как это сделано в том моде


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

Myprism  Offline  Сообщение №78 написано: 4 декабря 2012, 18:05


Физик


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

Artem13  Offline  Сообщение №79 написано: 4 декабря 2012, 18:09


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


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

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



14
Цитата Artem13

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


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

Artem13  Offline  Сообщение №81 написано: 5 декабря 2012, 08:48


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


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

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
VIPerMX  Offline  Сообщение №82 написано: 10 декабря 2012, 12:04 | Отредактировано: VIPerMX - 10 декабря 2012, 12: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, 14:05 | Отредактировано: Demolir - 10 декабря 2012, 14:12



420
Цитата 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, 14:46



173
Цитата Demolir

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



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

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

Demolir  Offline  Сообщение №85 написано: 10 декабря 2012, 15:37



420
Цитата VIPerMX

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


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

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

Pass += 2
GameDay.SetValue(Pass)

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

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



173
Цитата Demolir

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



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

Demolir  Offline  Сообщение №87 написано: 11 декабря 2012, 13:44



420
Цитата VIPerMX

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


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

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



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

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

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



Цитата 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, 10:39



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

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

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





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