Модератор форума: 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? Пиши не в ЛС, а в эту тему.
mrgreen1152  Offline  Сообщение №661 написано: 23 декабря 2013, 21:02



2
можно ли задать уникальную анимацию для оружия через скрипт? 
не заменяя дефолтную анимацию, только добавить новую
аналогичный вопрос про заклинания

LordVadim  Offline  Сообщение №662 написано: 24 декабря 2013, 08:19



139
Цитата mrgreen1152

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


Простого способа добавления новых анимаций в игру - нет.

Myprism  Offline  Сообщение №663 написано: 24 декабря 2013, 09:04


Физик


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

mrgreen1152  Offline  Сообщение №664 написано: 24 декабря 2013, 12:17



2
Myprism, есть же FNIS
через него можно вызвать кастомную анимацию на себя\нпс
понятно что без костылей никак, но может кто уже придумал?

nine-dragon-art  Offline  Сообщение №665 написано: 25 декабря 2013, 17:29



341
Кто может дать скрипт чтоб спутник лечил меня когда мое хп упало ниже 20% например ? Заранее спасибо)

border="0" alt=""/
LordVadim  Offline  Сообщение №666 написано: 4 января 2014, 05:44 | Отредактировано: LordVadim - 5 января 2014, 20:29



139
Цитата nine-dragon-art

Кто может дать скрипт чтоб спутник лечил меня когда мое хп упало ниже 20% например ? Заранее спасибо)


Возьми в компаньоны Селену Кейт - она лечит.
Или покопайся в её скриптах - разберёшься, как лечит. ;)

slastik  Offline  Сообщение №667 написано: 6 января 2014, 18:38


Жаждущий


209
Подскажите скрипт, который можно повесить на активатор для выключения/включения музыкального сопровождения в заданной локации. С условиями вроде: если музыка включена - отключить, если музыка отключена - включить. Сам пробовал решить этот вопрос окольными путями. Добавил за пределы локации объект MyStatic и в музыкальных треках добавил условие GetDisabled MyStatic == 0, а к активатору прикрутил скрипт:
If MyStatic.IsEnabled()
MyStatic.Disable()
Else
MyStatic.Enable()
EndIf
Ничего хорошего не получилось. Музыка выключается, но обратно ее вернуть не выходит :(

- Что это за горы стоят?
- А, это орки бегут!
LordVadim  Offline  Сообщение №668 написано: 7 января 2014, 00:00



139
Цитата slastik

Подскажите скрипт, который можно повесить на активатор для выключения/включения музыкального сопровождения в заданной локации. С условиями вроде: если музыка включена - отключить, если музыка отключена - включить. Сам пробовал решить этот вопрос окольными путями. Добавил за пределы локации объект MyStatic и в музыкальных треках добавил условие GetDisabled MyStatic == 0, а к активатору прикрутил скрипт: ... Ничего хорошего не получилось. Музыка выключается, но обратно ее вернуть не выходит.


ScriptName ActivateMusicCRIPT extends ObjectReference

SoundCategory Property AudioCategoryMUS Auto ;- Категория для отключения фоновой музыки игры

Bool Property MyMute = False Auto Hidden

Function SetMute()
    If MyMute
         AudioCategoryMUS.Mute() ;- Отключаем фоновую музыку
    Else 
          AudioCategoryMUS.UnMute() ;- Включаем фоновую музыку
    EndIf
EndFunction

EVENT OnActivate(ObjectReference TriggerRef)
    If MyMute
        MyMute = False
    Else
        MyMute = True
    EndIf
    SetMute()
EndEVENT

Event OnCellAttach() ;- Игрок вошел в ячейку
    SetMute()
EndEVENT

Event OnCellDetach() ;- Игрок покинул ячейку
    AudioCategoryMUS.UnMute() ;- Включаем фоновую музыку
EndEVENT

Myprism  Offline  Сообщение №669 написано: 10 января 2014, 09:13


Физик


Как засечь событие изготовления предмета в кузнице? Мне нужно получить переключение стадии квеста если игрок изготовил предмет в кузнице. Ведь после изготовления предмет не одевается, а кладётся в инвентарь. Я, конечно, могу поставить триггер, определяющий наличие предмета у игрока, но это немного некрасиво, так как сообщения квеста должны поступить сразу после изготовления предмета.

Aksyonov  Offline  Сообщение №670 написано: 10 января 2014, 13:50 | Отредактировано: Aksyonov - 10 января 2014, 13:52



937
Помогите пожалуйста, нужен скрипт для удаления статического объекта в локации + что бы на месте старого объекта появлялся другой на тех
же координатах, было бы замечательно если бы кто нибудь из вас скинул сюда готовый скрипт если он есть или написали бы самостоятельно :)

Myprism  Offline  Сообщение №671 написано: 10 января 2014, 14:16


Физик


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

Aksyonov  Offline  Сообщение №672 написано: 10 января 2014, 15:35



937
Цитата Myprism

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

Спасибо, как видите я с редактором creation Kit не слишком хорошо знаком, и думал что сделать то о чем спросил можно только при помощи скриптов, тем более что нужно сделать следующие, у нас есть дерево, к нему подходит давакин нажимает и проигрывается анимация если есть топор в инвентаре, давакин начинает рубить дерево, активное дерево Enable удаляется - и судя по вашим словам переключается в ползунок Disable а другое дерево на этом же месте появляется, в нашем случае это обычный пенек, но тогда в моде будет необходимо добавить туда где находится дерево миллионы пеньков? я думаю без скрипта все же не обойтись ? как считаете ?

Myprism  Offline  Сообщение №673 написано: 11 января 2014, 14:49 | Отредактировано: Myprism - 11 января 2014, 14:50


Физик


Цитата Myprism

Как засечь событие изготовления предмета в кузнице? Мне нужно получить переключение стадии квеста если игрок изготовил предмет в кузнице. Ведь после изготовления предмет не одевается, а кладётся в инвентарь. Я, конечно, могу поставить триггер, определяющий наличие предмета у игрока, но это немного некрасиво, так как сообщения квеста должны поступить сразу после изготовления предмета.

Отвечу сам на свой вопрос, может кому пригодится:

Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)
If akNewContainer == Game.GetPlayer()
If MyQuest.GetStage() < myStage
MyQuest.SetStage(myStage)
EndIf
EndIf
EndEvent

Zapasnoy  Offline  Сообщение №674 написано: 12 января 2014, 17:07



38
Подскажите а как потом из DPEX в PEX компилировать?

Greez  Offline  Сообщение №675 написано: 12 января 2014, 22:35 | Отредактировано: Greez - 12 января 2014, 22:35



20
доброго времени суток всем.

подскажите, существует ли скриптовый (или другой, но что бы я мог в скрипте получить да/нет) определить, что ГГ стоит на снегу ?
подозреваю, что через проверки на материал или еще как то, но что то сам не смог разобраться и найти решение.

заранее благодарен.

BSCheshir  Offline  Сообщение №676 написано: 17 января 2014, 19:47



6
Знатоки, помогите. Пытаюсь реализовать следующее - персонаж за определённое вознаграждение продаёт товары из различных магазинов (как бы посредник).
По соответствующей фразе пытаюсь добавить такой скрипт

Код
Scriptname KoshAddFaction extends TopicInfo   

MiscObject Property Gold001  Auto   
Faction property newFaction Auto
Int property barterCost Auto

;BEGIN FRAGMENT Fragment_0
Function Fragment_0(ObjectReference akSpeakerRef)
Actor akSpeaker = akSpeakerRef as Actor
;BEGIN CODE
Game.GetPlayer().RemoveItem(Gold001,barterCost)
akSpeaker.AddToFaction(newFaction)
akSpeaker.ShowBarterMenu()
;END CODE
EndFunction
;END FRAGMENT


однако ничего не происходит. ладно, добавляю в папирус энд
Код
Game.GetPlayer().RemoveItem(Gold001,barterCost)
akSpeaker.AddToFaction(newFaction)
akSpeaker.ShowBarterMenu()

прописываю передаваемые свойства снова, результат - меню открывается, но предметов для торговли нет. В чём причина, подскажите? и как запихать на результат нескольких диалогов один скрипт?
и кажется перестала убираться голда. Жуть что творится %)

Иероним  Offline  Сообщение №677 написано: 21 января 2014, 19:18



770
Со скриптами у меня пока всё плохо, однако хочу реализовать одну идею. В общей картине нужно чтобы в определённом месте появлялся объект на несколько секунд и затем исчезал. Может кто подскажет как это сделать?

LordVadim  Offline  Сообщение №678 написано: 22 января 2014, 08:51



139
Цитата Иероним

Со скриптами у меня пока всё плохо, однако хочу реализовать одну идею. В общей картине нужно чтобы в определённом месте появлялся объект на несколько секунд и затем исчезал. Может кто подскажет как это сделать?

При каких условиях должен появляться объект?

Иероним  Offline  Сообщение №679 написано: 22 января 2014, 09:09 | Отредактировано: Иероним - 22 января 2014, 09:11



770
LordVadim, при активации рычага или же попадание в определённое место на карте, скажем ходьба через коридор где игрок наступает на триггер и появляется нужный объект. Например чтобы пройдя коридор за спиной появился, предположим, скелет.

LordVadim  Offline  Сообщение №680 написано: 22 января 2014, 15:05



139
Цитата Иероним

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

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

Иероним  Offline  Сообщение №681 написано: 22 января 2014, 15:29



770
LordVadim, да тут даже не проблема а скорее полное незнание скриптинга. Согласен что никто здесь лекцию писать не будет, так что лучше я закрою свой вопрос. Пойду штурмовать всевозможные вики.
   Но всё равно спасибо.

LordVadim  Offline  Сообщение №682 написано: 22 января 2014, 17:29 | Отредактировано: LordVadim - 22 января 2014, 17:30



139
Цитата Иероним

да тут даже не проблема а скорее полное незнание скриптинга. Согласен что никто здесь лекцию писать не будет, так что лучше я закрою свой вопрос. Пойду штурмовать всевозможные вики.    Но всё равно спасибо.

Будут конкретные вопросы обращайтесь. Кстати, в этой ветке ранее обсуждался вопрос по отображению/скрытию предметов при активации рычага, поищите - может пригодится.

AleksTirex  Offline  Сообщение №683 написано: 24 января 2014, 18:49 | Отредактировано: AleksTirex - 24 января 2014, 22:43


Архимаг


371
Цитата Иероним

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



Скрипт вешается на активатор(рычаг) или на триггер. Там пошагово расписано, поэтому там всё понятно.

Scriptname TriggerActivatorToCreateActorScript extends ObjectReference

ActorBase Property akActorBase auto  ; базовый актёр, который появится за спиной ГГ
Static Property xMarkerHeading auto  ; маркер (нажать кнопку Auto-Fill)

Event OnActivate(ObjectReference akActionRef)
if akActionRef == Game.GetPlayer()
CreateActor()
endif
endEvent

Event OnTriggerEnter(ObjectReference akActionRef)
if akActionRef == Game.GetPlayer()
CreateActor()
endif
endEvent

Function CreateActor()
Actor akPlayer = Game.GetPlayer()
ObjectReference akMarker = akPlayer.PlaceAtMe(xMarkerHeading) ; создаём маркер у ГГ
float postargX = akPlayer.X - 100 * Math.Sin(akPlayer.GetAngleZ())
float postargY = akPlayer.Y - 100 * Math.Cos(akPlayer.GetAngleZ())
akMarker.MoveTo(akPlayer, postargX, postargY) ; отодвигаем маркер на 100 ед. за спину ГГ
Actor akNewActor = akMarker.PlaceActorAtMe(akActorBase) ; создаём актёра у маркера
; можно заставить актёра что-то делать, например akNewActor.StartCombat(akPlayer)
Utility.Wait(5.0)  ; ждём 5 сек. потом удаляем актёра и временный маркер
akMarker.Disable()
akMarker.Delete()
akNewActor.Disable()
akNewActor.Delete()
endFunction

LordVadim  Offline  Сообщение №684 написано: 24 января 2014, 19:46 | Отредактировано: LordVadim - 24 января 2014, 19:57



139
AleksTirex, разве с xMarkerHeading нужно использовать не PlaceAtMe()?
И зачем удалять созданного актера через 5 секунд после создания? Он же для чего то создавался...

И попутно вопрос: вот таким образом созданный, а потом удаленный актер оставляет какие либо следы в сейвах или нет?

BSCheshir  Offline  Сообщение №685 написано: 24 января 2014, 20:13



6
Не могли бы вы объяснить как добавить персонажу магазин, который расположен на другой локации? Или это в принципе невозможно?

Иероним  Offline  Сообщение №686 написано: 24 января 2014, 20:46



770
AleksTirex, что-то не получается ничего. Максимум чего добился это появление самого себя на маркере со старта локации. Заготовленным нпс и не пахнет. Пытался повесить скрипт на активатор. Можно для чайника разжевать более подробно? Ну не понимаю я ничего в скриптах, и как то не даются они мне особо.

AleksTirex  Offline  Сообщение №687 написано: 24 января 2014, 22:42 | Отредактировано: AleksTirex - 24 января 2014, 22:45


Архимаг


371
Цитата LordVadim

AleksTirex, разве с xMarkerHeading нужно использовать не PlaceAtMe()?  И зачем удалять созданного актера через 5 секунд после создания? Он же для чего то создавался...  И попутно вопрос: вот таким образом созданный, а потом удаленный актер оставляет какие либо следы в сейвах или нет?



Да, всё верно, это я со слепу и по запарке ошибся надо PlaceAtMe().

Удалять же актёра... так он сам писал: "...появлялся скелет, а потом исчезал." (но сейчас уже не нахожу этой строки, или он откорректировал сообщение, или я уже совсем суперстар, типа совсем старый, слепой и чуть-чуть в маразме :D ).
Если актёра удалять не надо, тогда просто удалить строки ожидания и удаления актёра:
  Utility.Wait(5.0)  ; ждём 5 сек. потом удаляем актёра и временный маркер
  akNewActor.Disable()
  akNewActor.Delete()


Следов в сейвах, в принципе, остаться не должно, для этого и пишется команда Delete(), т.е. не выключить, а именно удалить.

******************************************

Иероним, свойствам назначил нужные ID? (маркер и актёра)

И замени akPlayer.PlaceActorAtMe(xMarkerHeading) на akPlayer.PlaceAtMe(xMarkerHeading)

LordVadim  Offline  Сообщение №688 написано: 25 января 2014, 04:44 | Отредактировано: LordVadim - 25 января 2014, 04:45



139
Цитата AleksTirex

Я уже совсем суперстар, типа совсем старый, слепой и чуть-чуть в маразме   :D .

"Я Стар, я Суперстар, я Мегастар... ".  "Это я раньше был - Гендальф Серый, а теперь я - Саша Белый". :D  ("Властелин колец" в переводе Гоблина).

Иероним  Offline  Сообщение №689 написано: 25 января 2014, 07:41



770
AleksTirex, кое-что уже получается. В общем у меня была проблема с самими маркерами но повесив скрипт просто на активатор получилось по нажатию создать нпс, то есть желаемый результат получен. Но что касается со временем, да мне нужно было чтобы скелет появлялся на время но удалив строки скрипта

"Utility.Wait(5.0)  ; ждём 5 сек. потом удаляем актёра и временный маркер 
akMarker.Disable() 
akMarker.Delete() 
akNewActor.Disable() 
akNewActor.Delete() 
endFunction"

ничего не изменилось. Компилятор ругается и без этих строк скелетон всё равно исчезает через пять секунд. Не реагирует даже на смену самого времени.

Добавлено (25 Января 2014, 11:41)
---------------------------------------------
Продолжаю разбираться. Решил проблему с исчезновением повесив скрипт на триггер. Но теперь другая проблема, как сделать чтобы при заходе на триггер нпс создавался единожды а то получаются сплошные дубликаты.


AleksTirex  Offline  Сообщение №690 написано: 25 января 2014, 11:18


Архимаг


371
Цитата LordVadim

"Я Стар, я Суперстар, я Мегастар... ".  "Это я раньше был - Гендальф Серый, а теперь я - Саша Белый".   ("Властелин колец" в переводе Гоблина).



Ты даже не представляешь, на сколько ты прав. :)

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





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