Модератор форума: 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? Пиши не в ЛС, а в эту тему.
nepewka  Offline  Сообщение №3091 написано: 30 апреля 2022, 17:23



255
Multigone
Цитата nepewka

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


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

Multigone  Offline  Сообщение №3092 написано: 30 апреля 2022, 18:27



832
nepewka, не возражаю, доделывай. Вкратце, алгоритм: в алиас квеста для игрока добавляется абилити с эффектом констант-селф-плащ. Квест запускается стандартным скриптом (флаги runOnce, startGameEnabled, может что еще)...
EVENT OnInit()
IF !IsCompleted()
Start()
ENDIF
ENDEVENT

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

Это все для Скайрима, исключая выдачу перка, что там для F4 - не в курсе.


nepewka  Offline  Сообщение №3093 написано: 30 апреля 2022, 19:43



255
Цитата Multigone

в алиас квеста для игрока добавляется абилити с эффектом констант-селф-плащ


это сюда имеешь ввиду?  как делается сам плащ и скрипт в нём с перком +- знаю

EVENT OnInit()

IF !IsCompleted()

Start()

ENDIF

ENDEVEN


Multigone  Offline  Сообщение №3094 написано: 30 апреля 2022, 21:58 | Отредактировано: Multigone - 30 апреля 2022, 22:05



832
nepewka, да,  хочешь, туда! Типа...
Start()
Game.GetPlayer().AddSpell(MyPlasch)

Но лучше так, как полагается:
Цитата Multigone

в алиас квеста для игрока добавляется абилити с эффектом констант-селф-плащ. Квест запускается стандартным скриптом

В референс алиас квеста, изначально заполненный игроком. Абилити можно добавить только в окно Spells алиаса. Скрипт со Start() вешается во вкладку Scripts квеста. Это ж все базовые вещи.


Mgichko  Offline  Сообщение №3095 написано: 6 мая 2022, 13:53



2
Добрый День! Прошу вас помочь в одной проблеме. При создании какого либо мода в CreationKit не работает Папирус. Хоть то какието квесты, хоть при создании простого торговца. Что только не пробовал. Решил писать уже на форумах. Проблема с какимто флагом. Ниже стандартное сообщение
Starting 1 compile threads for 1 files...
Compiling "TIF__02008F83"...
(0,0): Unable to find flags file: TESV_Papyrus_Flags.flg
E:\Skyrim Special Edition\The Elder Scrolls V Skyrim - Special Edition\Data\Scripts\Source\temp\TIF__02008F83.psc(3,0): Unknown user flag Hidden
No output generated for TIF__02008F83, compilation failed.

Batch compile of 1 files finished. 0 succeeded, 1 failed.
Failed on TIF__02008F83

Что у меня: Пиратка Скайрима Спец Издания последней версии со SKSE последней версии. архив с Scripts распакован, CreationKit запускается от имени админа. Пользуюсь МО2, и при работе с модификациями не содержащими скрипты проблем нет. CreationKit от "кракозябр" вылечен...  Чисто интуитивно предполагаю, что ответ на поверхности, но вообще не знаю что уже и думать..


Multigone  Offline  Сообщение №3096 написано: 6 мая 2022, 17:34



832
Mgichko, попробуй следующее (не уверен, что подойдет для SE): в Data/Scripts/Source создай текстовый файл с указанным содержанием, затем переименуй его в TESV_Papyrus_Flags.flg
Flag Hidden 0
{
    Script
    Property
}
Flag Conditional 1
{
    Script
    Variable
}

valambar  Offline  Сообщение №3097 написано: 30 мая 2022, 20:40 | Отредактировано: valambar - 30 мая 2022, 20:43



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

Вопросы:

1. Как выбрать тип эвента - OnEquipped или OnRead? И соответственно - что у них должно быть прописано в скобочках?

2. При компиляции конструктор ругается, что ID слова силы, которое я прописал в скобках после Teachword, не определено. Что нужно прописать, чтобы оно было компилятором найдено?


Multigone  Offline  Сообщение №3098 написано: 31 мая 2022, 09:24 | Отредактировано: Multigone - 31 мая 2022, 09:53



832
valambar,

ScriptName _TESTNEW Extends ObjectReference

WordOfPower Property MyWord Auto ; заполнить в СК properties.

EVENT OnRead()
    Game.TeachWord(MyWord)
ENDEVENT

valambar  Offline  Сообщение №3099 написано: 31 мая 2022, 13:28 | Отредактировано: valambar - 31 мая 2022, 13:39



513
Скрипт сохранился без сообщений об ошибках, но при прочтении слово все равно не изучается. 

_____


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


Надо поколдовать с условиями выполнения скрипта.


Multigone  Offline  Сообщение №3100 написано: 31 мая 2022, 13:58



832
valambar, а так:

ScriptName _TESTNEW Extends ObjectReference

WordOfPower Property MyWord Auto ; заполнить в СК properties.

EVENT OnRead()
    Game.TeachWord(MyWord)
ENDEVENT

EVENT OnEquipped(Actor akActor)
    IF akActor == Game.GetPlayer()
        Game.TeachWord(MyWord)
    ENDIF
ENDEVENT

valambar  Offline  Сообщение №3101 написано: 31 мая 2022, 14:01 | Отредактировано: valambar - 31 мая 2022, 15:08



513
Погляжу. 


________________________


Сейчас пока еще один вопрос: 

Если я пишу в результирующем скрипте диалога вот так:

Game.Getplayer().Additem(DragonDictionary, 1) - компилятор ругается на неизвестную вещь DragonDictionary, которая является книгой.

Как я понял, ее надо сначала ввести как проперть. Тогда вопрос - к какому типу пропертей относятся книги?

И вообще - может, где-то есть руководство, где ВСЕ типы пропертей перечислены?


Multigone  Offline  Сообщение №3102 написано: 31 мая 2022, 15:44 | Отредактировано: Multigone - 31 мая 2022, 15:59



832
valambar, в вики.

А также:
https://www.creationkit.com/index.php?title=Category:Script_Objects
https://www.creationkit.com/index.php?title=Keyword_Reference
https://www.creationkit.com/index.php?title=Operator_Reference
https://www.creationkit.com/index.php?title=Flag_Reference
https://www.creationkit.com/index.php?title=State_Reference
https://www.creationkit.com/index.php?title=Hotkey_reference

https://www.creationkit.com/index.php?title=Category:Papyrus_Language_Reference

valambar  Offline  Сообщение №3103 написано: 1 июня 2022, 15:48



513
С пропертями разобрался.

Но еще не разобрался, как написать результирующий скрипт для диалога, чтобы в ходе диалога вещь (в данном случае книга) добавлялась в инвентарь игрока. В Обливионе и Фоллауте 3 и Нью Вегас это было предельно легко, а вот здесь...

Я не нашел подходящего типа эвента, чтобы он работал в диалоге.


Multigone  Offline  Сообщение №3104 написано: 1 июня 2022, 16:40 | Отредактировано: Multigone - 1 июня 2022, 16:45



832
valambar, общее правило для пустого окна скрипт-фрагментов диалогов: в одном из окон написать ";", скомпилировать, сохранить (закрыть) окно диалога, открыть его, добавить нужное Property (кнопка сбоку), стереть ";", написать желаемый код, в котором выполняются операции с этим Property. Скомпилировать.

Событий там нет, код выполняется в момент начала или конца диалога (это и есть события скрипт-фрагментов диалогов). Сам код будет выглядеть так:
Game.GetPlayer().AddItem(MyPropertyName, 1)
Также там есть доп. предустановленные переменные (говорящий).

valambar  Offline  Сообщение №3105 написано: 2 июня 2022, 12:17 | Отредактировано: valambar - 2 июня 2022, 15:59



513
Благодарю. Сейчас попробую. 

_________________


Всё скомпилировалось. Сейчас попробую в игре (задумка мода такова, что за квест с гробницей Валока Тарстан  дает в награду не какие-то там жалкие септимы, а свою книгу - драконий словарь, который позволяет выучить слова силы, еще не выученные игроком).


________________

В игре несмотря на то, что я добавил эвент OnEquipped - всё равно срабатывает только на чтение вне инвентаря, т.е. эвент OnRead.


________________


Теперь слова изучаются и при прочтении из инвентаря. 

А выдается книга при диалоге с Тарстаном почему-то дважды. Надо поглядеть, где я накосячил.


DOOM2004  Offline  Сообщение №3106 написано: 24 июля 2022, 09:05



10
Товарищи, помогите пожалуйста.

ScriptName ResetInventoryNPC_Whiterun_Script Extends ReferenceAlias

FormList Property ResetNPCWhiterunLIST Auto
ObjectReference Property BanneredMareBad Auto

Event OnActivate(ObjectReference BanneredMareBad)
  Debug.Notification("Обновление нарядов NPC в Вайтран")
    Int Index = ResetNPCWhiterunLIST.GetSize()
    While (Index > 0)
        Index -= 1
        ObjectReference ActorRef = ResetNPCWhiterunLIST.GetAt(Index) as ObjectReference
        If (ActorRef as Bool)
            Debug.Trace("ResetInventoryFormListNPC >> " + ActorRef as String + " >> ResetInventory()")
            ActorRef.ResetInventory()
        EndIf
    EndWhile
EndEvent

Суть скрипта в том что при использовании кровати на NPC из FromLIST используется команда resetinventory. Скрипт прикремлен через квест -> алиас на игрока. Но чет не работает.

Multigone  Offline  Сообщение №3107 написано: 24 июля 2022, 13:35 | Отредактировано: Multigone - 24 июля 2022, 13:42



832
DOOM2004,

1) OnActivate() срабатывает на объекте, который активируют. Поскольку скрипт на алиасе игрока, то событие сработает, если игрока попытается активировать другой объект.
2) У тебя 2 разные переменные с одинаковым именем BanneredMareBad. Скрипт не скомпилируется.
3) Property BanneredMareBad в скрипте не используется (либо скрипт выложен не полностью).


DOOM2004  Offline  Сообщение №3108 написано: 24 июля 2022, 17:43



10
Multigone, сделал вот так

ScriptName ResetInventoryNPC_Whiterun_Script Extends ObjectReference

FormList Property ResetNPCWhiterunLIST Auto

Event OnActivate(ObjectReference BanneredMareBad)
  Debug.Notification("Обновление нарядов NPC в Вайтран")
    Int Index = ResetNPCWhiterunLIST.GetSize()
    While (Index > 0)
        Index -= 1
        ObjectReference ActorRef = ResetNPCWhiterunLIST.GetAt(Index) as ObjectReference
        If (ActorRef as Bool)
            Debug.Trace("ResetInventoryFormListNPC >> " + ActorRef as String + " >> ResetInventory()")
            ActorRef.ResetInventory()
        EndIf
    EndWhile
EndEvent

deug выводится, а дольше не работает. В чем может быть дело?


Multigone  Offline  Сообщение №3109 написано: 24 июля 2022, 19:33



832
DOOM2004,

1) Не заполнено Property.
2) Property заполнено форм-листом, в котором нет ObjectReference.
3) Property заполнено форм-листом с несколькими разными типами форм.

Int Index = ResetNPCWhiterunLIST.GetSize()

Debug.Notification("Длина форм-листа " + Index)

...



Lissenok  Offline  Сообщение №3110 написано: 21 сентября 2022, 15:44



18
Здравствуйте. Можно ли сделать так, чтобы определенная ячейка в экстерьере не обновлялась? Например с помощью скрипта,который вешался бы на триггер. Которым, в свою очередь,окружить нужное место? (нужно для размещения манекенов на улице)

Multigone  Offline  Сообщение №3111 написано: 21 сентября 2022, 18:05



832
Lissenok, некоторые объекты при обновлении ячейки не обновляются.

Lissenok  Offline  Сообщение №3112 написано: 21 сентября 2022, 18:18



18
Multigone, Но броня на манекенах и оружие на стойках будут пропадать. А вот этого,как раз,хотелось бы избежать.

Multigone  Offline  Сообщение №3113 написано: 21 сентября 2022, 18:56



832
Lissenok, ну почему, почему броня на манекенах и оружие на стойках будут пропадать? Разве манекены не являются актерами, размещаемыми через PlaceAtMe? А значит, их инвентарь, состояние и скрипты не будут затронуты при обновлении ячейки? То же можно сказать про стойки? А даже если и нет, и эти объекты являются включаемыми / отключаемыми, разве обязательно указывать флаг Respawn у их СК-референсов? Может, нужно проверить их реальное поведение, набрав в консоли (SetGameSetting  iHoursToRespawnCell 1), выйти с этой локации, подождать пару часов и вернуться обратно? Так много вопросов, так мало ответов...

Lissenok  Offline  Сообщение №3114 написано: 21 сентября 2022, 19:01



18
Multigone, Было проверено в интерьере дома у которого не было NoResetZone. Броня пропадает 100%.

Multigone  Offline  Сообщение №3115 написано: 21 сентября 2022, 19:29



832
Lissenok, нужно проверить флаг Respawn у референсов манекенов и стоек.

Lissenok  Offline  Сообщение №3116 написано: 21 сентября 2022, 19:35



18
Multigone, У манекенов их нет изначально. И броня привязанная в конструкторе, действительно не пропадает, а выданная во время игры пропадает.

Multigone  Offline  Сообщение №3117 написано: 21 сентября 2022, 20:05 | Отредактировано: Multigone - 22 сентября 2022, 06:14



832
Lissenok, броня у них может пропасть, если они обновляются, теряя свой инвентарь и/или переменные скрипта MannequinActivatorSCRIPT (при обновлении скрипт ре-инициализируется). Если броня, выданная в СК, не пропадает, это тоже может говорить в пользу их обновления. Это можно проверить, добавив референсу манекена скрипт...
ScriptName _TESTNEWMANN Extends ObjectReference

EVENT onreset()
    Utility.Wait(0.5)
    Debug.MessageBox("_TESTNEWMANN onreset()")
ENDEVENT
Или, добавить референсу манекена другой скрипт, и, дав манекену броню в игре, проверить переменную скрипта после обновления ячейки (предполагается, что скрипт MannequinActivatorSCRIPT ванильный):
ScriptName _TESTNEWMANN Extends ObjectReference

EVENT OnCellAttach()
    Utility.Wait(0.5)
    MannequinActivatorSCRIPT xS = (self AS Actor) AS MannequinActivatorSCRIPT
    IF !xS
        Debug.MessageBox("MannequinActivatorSCRIPT не найден!")
    ELSEIF !xS.ArmorSlot01
        Debug.MessageBox("Манекен не имеет запомненных слотов брони!")
    ELSE
        Debug.MessageBox("Манекен имеет хотя бы один запомн. слот")
        Debug.MessageBox(xS.ArmorSlot01.GetName())
        Debug.MessageBox("Количество этих предметов в его инвентаре " + GetItemCount(xS.ArmorSlot01))
    ENDIF
ENDEVENT

Lissenok  Offline  Сообщение №3118 написано: 22 сентября 2022, 09:15



18
Multigone, По итогам теста: манекен с первым скриптом - броня пропала. Со вторым - тоже(но он компилировался с ошибкой,поэтому под вопросом), с обычного вынильного так же. Стойки для щитов и оружия( если убрать флаг respawn с референсов активаторов) пока все на месте.

Multigone  Offline  Сообщение №3119 написано: 22 сентября 2022, 11:16



832
Lissenok, первый скрипт должен выводить сообщение, когда (если) происходит обновление манекена. Для этого он должен быть добавлен к референсу, а не базовому актеру. Если он добавляется базовому актеру, скрипт должен расширять Actor (т.е. ScriptName _TESTNEWMANN Extends Actor).

Второй, да, я его не проверял на компиляцию. Строка 5:
    MannequinActivatorSCRIPT xS = ((self AS ObjectReference) AS Actor) AS MannequinActivatorSCRIPT
Он должен выводить сообщение при каждой загрузке ячейки о состоянии манекена (есть ли у него запомненные слоты одежды и что надевать для этого). Если манекен обновляется, нужно задаться вопросом, почему это происходит в обход отсутствия у него флага Respawn, либо почему в вики указана неполная инфа.

Lissenok  Offline  Сообщение №3120 написано: 22 сентября 2022, 12:39 | Отредактировано: Lissenok - 22 сентября 2022, 14:24



18
Multigone, Скрипты я добавляла именно референсам. Сообщение выводилось(от первого скрипта). Может что-то в ванильном скрипте заставляет их обновляться? Кстати, ванильный скрипт тоже компилируется с ошибкой: не является функцией или не существует.


Да..... От безысходности просто окружила манекены ванильным триггер боксом, сняла с его референса флаг респауна и... вся броня на месте! и сундук с флагом респауна в этом боксе тоже не обновился)


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





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