Модератор форума: 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? Пиши не в ЛС, а в эту тему.
Rare  Offline  Сообщение №1951 написано: 2 января 2016, 22:51



6
Нескромный вопрос... Но как проверить что рубильник/вентили или серия их, включены? Скрипт весит на "проверяющей" кнопке, а проверяемые назначены через 
Код
ObjectReference Property valve_1 Auto

Dsion  Offline  Сообщение №1952 написано: 2 января 2016, 23:33



Всё, что на объекте типа ObjectReference можно проверить, вот тут указано:
http://www.creationkit.com/ObjectReference_Script
Вряд ли что-то подойдет...

Скорее всего, придется создать еще один скрипт и развесить по рычагам. Что-то такого типа:

Код

Scriptname RareValveScript extends ObjectReference

Bool Property Activated = False Auto

Event OnActivate(ObjectReference akActionRef)
    Activated = !Activated
EndEvent


Тогда потом в скрипте кнопки можно:

RareValveScript Property Valve_01 Auto

If (Valve_01.Activated)
EndIf

Rare  Offline  Сообщение №1953 написано: 3 января 2016, 10:06



6
Разобрался.

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

botbot  Offline  Сообщение №1954 написано: 4 февраля 2016, 18:35



2
Всем привет. Программировать умею, но с папирусом никогда не работал. Захотел дописать ии для нпц,  вопросы:
1 как внедрить свой код в уже существующего нпц? Чтоб не через редактор всех менять? В голову приходит такое: наследую свой скрипт от квеста (чтоб он активировался в момент начала игры),  далее каким-то образом мониторю сцену вокруг главного героя, далее добавляю всем actor вокруг свой код.
И это порождает ещё вопросы:
2 как отловить появление нового actor около героя (не перебором же)? 
3 куда можно добавить уже существующему actor дополнительное поведение?
4 все новое состояние actor нормально будет в сохранения игры писаться?

Myprism  Offline  Сообщение №1955 написано: 5 февраля 2016, 04:39


Физик


botbot, методы объектно ориентированного программирования, конечно, используются в папирусе, но очень ограниченно. Главное же, там страшно ограничен набор свойств, которые можно менять. Это специфический язык. Надо изучать, чтобы понять пределы его применения :( Многое из того, что бы хотелось, вообще нельзя сделать.

botbot  Offline  Сообщение №1956 написано: 5 февраля 2016, 18:34



2
Ну, промежуточный вариант поисков такой:
Да, действительно можно лишь перебирать Game.FindRandomActorFromRef, она возвращает случайные акторы в некотором радиусе. Вызывая несколько раз и сохраняя результат можно получить список акторов. 
По поводу ии: изначально игра его хранит в объектах Package (странное название для ии), но для добавления своего ии эти объекты подходят плохо. Зато, если я правильно понял, свой код можно писать в объекте AliasRefference и потом в нём вызывать ForceRefTo(actor), таким образом добавляя актору свое поведение. Сам AliasRefference как-то связан с квестами. Пока все, копаю дальше.

Dsion  Offline  Сообщение №1957 написано: 5 февраля 2016, 18:43 | Отредактировано: Dsion - 5 февраля 2016, 18:45



В Скайриме NPC пакетами управляются. Если надо, чтоб он куда-то шел, что-то делал или что-то колдовал - всё это пакетами делается.
Есть способ, если хочешь, всех окружающих NPC разсовать по алиасам... Но все-равно надо больше в сторону пакетов копать, а не по скриптам.

вадавад  Offline  Сообщение №1958 написано: 11 февраля 2016, 08:43



5
Ребята, уроки прочёл. Что-то внял, а что-то нет. Остались вопросы.
1 Где узреть ВЕСЬ список проишествий, функций, переменных и их значений?
2 Одежду/доспех можно взять, а можно надеть. Чему будет соответствовать onAktivate?
3 Как я понял string выплывает в левом углу экрана как название локации или добыт очередной камушек, да?
4 Почему-то не все эффекты подходят для зачарования, почему? Мне было бы проще и не надо было бы писать скрипт.
Мне нужно, чтоб надевание моего камзола давало способность торговли краденым. Только лишь через скрипт это решать надо?
Кто знает, помогите пожалуйста.

Dsion  Offline  Сообщение №1959 написано: 11 февраля 2016, 12:00



Кто-то перевел "events" как происшествия? :-D Уфф... lol
Да не, в принципе, всё правильно. Но все-равно смешно.

вадавад, вот тут домашняя страничка скриптописателя:
http://www.creationkit.com/Category:Script_Objects

В первую очередь глянь ObjectReference и Actor. ObjectReference - это для любых объектов в мире в том числе NPC и игрока, а Actor - только для живых NPC и игрока.

вадавад  Offline  Сообщение №1960 написано: 11 февраля 2016, 23:52 | Отредактировано: Multigone - 27 апреля 2020, 16:31



5
Dsion, Дружище, скажи, пожалуйста, что тут неправильно?

Код
armor Property pNegodress auto
armor Property pNegohetf auto
armor Property pNegohetm auto
armor Property pNegoamulet auto

spell Property pMasterTrader auto
spell Property pPerkMerchant auto
spell Property pPerkFence auto

string(1) = "Торговцы будут ослеплены убранством ваших одежд и готовы даже перезанять золото, чтобы торговать с вами."
string(2) = "Торговцы всецело вам доверяют и не интересуются историей товара. Вы можете торговать краденым."
string(3) = "Торговцы не желают упустить возможность торговать с вами они согласны на любой товар."

Event  OnObjectEquipped(OBJECTREFERENCE armor)
     IF(pNegodress)
       string(1).show()
       game.getPlayer().addSpell(pMasterTrader)
     ELSEIF(pNegohetf)
       string(2).show()
       game.getPlayer().addSpell(pPerkMerchant)
     ELSEIF(pNegohetm)
       string(2).show()
       game.getPlayer().addSpell(pPerkMerchant)
     ELSEIF(pNegoamulet)
       string(3).show()
       game.getPlayer().addSpell(pMasterTrader)
     ENDIF
endEVENT

  Event offObjectEquipped(OBJECTREFERENCE armor)
     IF(pNegodress)
       game.getPlayer().removeSpell(pMasterTrader)
     ELSEIF(pNegohetm)
       game.getPlayer().removeSpell(pPerkMerchant)
     ELSEIF(pNegohetm)
       game.getPlayer().removeSpell(pPerkMerchant)
     ELSEIF(pNegoamulet)
       game.getPlayer().removeSpell(pMasterTrader)
     ENDIF
endEVENT

Dsion  Offline  Сообщение №1961 написано: 12 февраля 2016, 12:20



Я тебе компилятор что-ли? :)
А вообще, неправильно дофига всего. Во-первых, нету заголовка (Scriptname) и не ясно, на что ты скрипт вешаешь.
Во-вторых, проверь, действительно ли это должны быть именно заклинания Spell, а не перки Perk.
В-третьих, со string вообще мутно чо-то. Метод Show есть на объектах типа Message. То есть, сначала надо создать в CK Message c тексом, а потом в скрипте использовать Message Property и Show на ней.
В-четвертых, неправильно скопированы название и аргументы ивентов. Подолбности в Actor Script
И в-пятых, неправильный синтаксис оператора If. В скобках должно быть условие.
Еще я не уверен, что ты заполнил Property. И что повесил скрипт куда надо.

Если эти вещи (pNegodress итп) не ванильные, а ты сам зафигарил, лучше вешать скрипт совсем другой на сами вещи, а не на алиас игрока. Намного короче и понятнее получится. И квест не понадобится.

вадавад  Offline  Сообщение №1962 написано: 12 февраля 2016, 15:49



5
Dsion, Нет-нет, ты ни в коем случае не компилятор. С компелятором я уже общался. У нас вышел спор и, видимо, кто-то из нас двоих дурак, мне хочется думать , что он.
Если бы работало зачарование, я б ни в жисть не полез в скрипты. Я в них как русалка в молоке и с прожектором, светло, да не видно.
Этот скрипт (т.е его элементы) я списал с камней-хранителей (леди, лорда, коня и т.д.) До этого я нашёл, мне казалось, хорошее решение -- я вписал одежёнку в условия перка и она давала возможность открыть этот перк. Уже начал думать о себе хорошо, как выяснилось, что сняв одежду с героя, перк, однажды открытый, таковым и остаётся. Это никак не входит в мой маленький сценарий. Вот, что меня загнало в этот угол со скриптами.
Теперь о твоей последней строчке: "Намного короче и понятнее получится."
Да я к этому и стремлюсь! К простоте и минимизации, и вообще с радостью бы обошёлся без скриптов.
Прошу тебя, напиши мне, умный человек, где мне скатать такой скрипт или перенять способ, что бы я уже никого не доставал и себя не мучил, ибо вторую неделю я без покоя живу в паутине холодных и чужих мне скриптов.

evTau  Offline  Сообщение №1963 написано: 13 февраля 2016, 13:27 | Отредактировано: evTau - 13 февраля 2016, 14:42



Парни подскажите скрипт который при экипировке брони снимал бы ее с игрока и удалял из инвентаря. Желательно какой то универсальный чтобы можно было на любую броню его повесить для 32 слота.

andrelo-1  Offline  Сообщение №1964 написано: 14 февраля 2016, 14:58 | Отредактировано: andrelo-1 - 14 февраля 2016, 15:27



172
evTau, можно прямо на игрока повесить, так универсальней будет:

bool Function NeedToRemove( Form obj )
...
EndFunction

Event OnObjectEquipped( Form obj, ObjectReference objRef )
if ( NeedToRemove( obj ) )
UnequipItem( obj )
RemoveItem( obj )
endif
EndEvent

Только эффект мелькания брони скорее всего останется, то есть на какое-то время броня все же появится как одетая.

evTau  Offline  Сообщение №1965 написано: 14 февраля 2016, 15:17 | Отредактировано: evTau - 14 февраля 2016, 15:19



Цитата andrelo-1

Только эффект мелькания брони скорее всего останется, то есть на какое-то броня все же появится как одетая.

Это фигня не смертельно. Я только 1 не понял Form obj это что? Я в скриптах более менее что то понимаю, но в основном дубина  :D

obj это EditorID предмета?

andrelo-1  Offline  Сообщение №1966 написано: 14 февраля 2016, 15:35 | Отредактировано: andrelo-1 - 14 февраля 2016, 15:51



172
Цитата evTau

obj это EditorID предмета?


obj - это объект типа Form :) . Какие у него есть функции можно тут посмотреть. Если нужен id, то пишешь obj.GetFormID(). Только определять по id, что за предмет, не лучшая идея, так как id зависит от порядкового номера мода в списке модов.

Вариант со скриптом на самой броне мне кажется не получится сделать, так как событие есть только на ObjectReference (т.е. конкретном экземпляре объекта), а Armor такого события не имеет.

evTau  Offline  Сообщение №1967 написано: 14 февраля 2016, 15:48 | Отредактировано: evTau - 14 февраля 2016, 16:03



Цитата andrelo-1

Scriptname TargetArmorChange extends activemagiceffect

INT TORSO = 32Armor
Property AltArmor Auto
Armor SavedtArmor

Event onEffectStart(Actor akTarget, Actor akCaster)
SavedtArmor = akTarget.GetWornForm(TORSO) as armor
akTarget.EquipItem(AltArmor)
endEvent

Event OnEffectFinish(Actor akTarget, Actor akCaster)
Utility.Wait(5.0)
akTarget.UnequipItem(AltArmor)
akTarget.RemoveItem(AltArmor, 1)
akTarget.EquipItem(SavedtArmor)
SavedArmor = none
EndEvent


Но что то не хочет такая реализация работать.

andrelo-1  Offline  Сообщение №1968 написано: 14 февраля 2016, 15:58 | Отредактировано: andrelo-1 - 14 февраля 2016, 16:02



172
Цитата evTau

как скрипт будет определять что удалять а что нет

Есть масса способов. Можно, например, на броню, которую нужно удалять добавить Keyword, наличие которого будет проверять скрипт. Можно составить спиcок (FormList), в который внести все типы брони, которые нужно удалять, и скрипт будет проверять наличие брони в этом списке.
В первом случае нужно будет добавить твой мод как мастер-файл во все моды брони, во втором случае наоборот - добавить все моды брони как мастер-файлы для твоего мода.

PS: Функции для получения EditorID в папирусе нет, есть только GetName().

evTau  Offline  Сообщение №1969 написано: 14 февраля 2016, 16:21



Есть мод bodyshape в нем 9 пресетов для смены тел. Я его ставлю в связке с модом SM Essential player в котором при смерти ты превращаешся в призрака и через какое то время опять приобретаеш тело и на тебя одевается домотканая одежда. Так вот в этом bodyshape есть функция гардероба, то есть при одевании назначеной брони в 32 слот применяется один из 9 пресетов тела. Я хочу сделать 2 одинаковых пресета тел, но с разными текстурами.

1 прест тело в синяках. И поставить этот пресет на Домотканую одежду. То есть умер одежда оделась пресет 1 загрузился ГГ в синяках.
2 пресет сделать без синяков. И привязать к новой броне (даже без модели) Назвать ее "Мазь от синяков". Вот мне и нужен скрипт чтобы одеть эту броню тем самым загрузится 2 пресет и чтобы броня после этого удалилась вроде как мазью помазался и она пропала. Такие танцы с бубнами просто из за того что нужна имено одежда в 32 слот. Я сделал все работает, но броня остается, то есть юзай сколько хочеш раз, а это не интересно.

andrelo-1  Offline  Сообщение №1970 написано: 14 февраля 2016, 16:44



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

evTau  Offline  Сообщение №1971 написано: 14 февраля 2016, 16:50 | Отредактировано: evTau - 14 февраля 2016, 19:26



Цитата andrelo-1

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

Ну то что он не логичен это да, но эту фигню можно через магический эффект прикрутить который повесить на банку. Ковырять функцию гардероба с минимумом знаний в скриптинге не к чему хорошему не приведет.  :D Ладно спс за советы буду думать как это реализовать. А то что через броню даже интереснее... можно сделать подмену опять же текстур тела типо вся в бинтах повесить продолжительность эффекта минут 5-10 и когда он кончится тело в бинтах удалится и загрузится пресет с чистой кожей.

Сделал магический эффект с кастом на себя, повесил на него скрипт

Scriptname _curebruisescript extends activemagiceffect

Armor Property _BruiseBandages Auto
Armor SavedTorso

Event onEffectStart(Actor akTarget, Actor akCaster)
SavedTorso = akTarget.GetWornForm(0x00000004) as armor
akTarget.EquipItem(_BruiseBandages)
EndEvent

Event OnEffectFinish(Actor akTarget, Actor akCaster)
akTarget.UnequipItem(_BruiseBandages)
akTarget.removeitem(_BruiseBandages, 1)
akTarget.EquipItem(SavedTorso)
SavedTorso = none
EndEvent

Прикрутил магический эффект к банке. Теперь пьеш банку одевается броня на 10 секунд (тело в бинтах, поменяю на какой нибудь шейдер магический наверно). После 10 секунд бинты снимаются и удаляются. И одевается назад броня которая была одета на персонаже до применения банки.

sansuli  Offline  Сообщение №1972 написано: 19 февраля 2016, 20:50 | Отредактировано: sansuli - 19 февраля 2016, 20:58


The Red Sun


193
Цитата вадавад

Ребята, уроки прочёл. Что-то внял, а что-то нет. Остались вопросы.1 Где узреть ВЕСЬ список проишествий, функций, переменных и их значений?
2 Одежду/доспех можно взять, а можно надеть. Чему будет соответствовать onAktivate?
3 Как я понял string выплывает в левом углу экрана как название локации или добыт очередной камушек, да?
4 Почему-то не все эффекты подходят для зачарования, почему? Мне было бы проще и не надо было бы писать скрипт.
Мне нужно, чтоб надевание моего камзола давало способность торговли краденым. Только лишь через скрипт это решать надо?
Кто знает, помогите пожалуйста.


1. Как активируют файл, добавлю в шапке темы ссылку на скачивание архива с файлами, содержащие в себе все функции и события игры.
2. onAktivate - эт активация обьекта нажатием клавиши "Е", то есть дверь, лежащий на прилавке помидор и тп. Но это событие не запустится если активация будет в инвентаре.
3. Нет String это тип хранения переменной, а то что выплывает в левом углу экрана это функция Debug.Notification("Вот эта")
4. Нет можно обойтись без скриптов, это можно сделать через перки в разделе перков в Creation Kit и просто добавить условие экипировки камзола. Но надо учесть что в игре уже есть этот перк в дереве Красноречия.

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
вадавад  Offline  Сообщение №1973 написано: 19 февраля 2016, 23:11



5
Цитата sansuli

4. Нет можно обойтись без скриптов, это можно сделать через перки в разделе перков в Creation Kit и просто добавить условие экипировки камзола. Но надо учесть что в игре уже есть этот перк в дереве Красноречия.

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

Kepper  Offline  Сообщение №1974 написано: 20 февраля 2016, 07:50 | Отредактировано: Kepper - 20 февраля 2016, 07:51



860
вадавад, повесь этот скрипт на Армор и заполни свойства.
Функции AddPerk и RemovePerk я лично не проверял, но думаю работать будут(правда в их описании написано что они работают только для игрока).
Оденешь одежду - выдадут перк и выведут сообщение в отдельном окне.
Сообщение в виде исчезающей надписи тоже можно вывести, но тогда оно должно быть максимально коротким иначе будет не читабельно.

Код
Scriptname NameOfSomeScript extends ObjectReference
Perk property akPerk auto
Message property InfoMessage auto
;String property InfoString auto

Event OnEquipped(Actor akActor)
  game.getPlayer().AddPerk(akPerk)
  InfoMessage.show()
  ;Debug.Notification(InfoString)
endEVENT

Event OnUnequipped(Actor akActor)
  game.getPlayer().RemovePerk(akPerk)
endEVENT

NoSilence  Offline  Сообщение №1975 написано: 20 февраля 2016, 11:00 | Отредактировано: NoSilence - 20 февраля 2016, 11:01



3
Хай. Помогите с формами и их подключению к скрипту. Никак не могу понять, как их получить (узнать). Например, роба жреца Мотылька. В CK её ID: DLC1ClothesMothPriestRobes, но такой формы даже приблизительно не существует. Соответственно, не могу узнать надета ли она на персонажа IsEquiped'ом.

andrelo1  Offline  Сообщение №1976 написано: 20 февраля 2016, 11:58



13
NoSilence, нужно добавить к скрипту свойство(Property) типа Armor, и установить в значении робу жреца.

NoSilence  Offline  Сообщение №1977 написано: 20 февраля 2016, 13:23 | Отредактировано: NoSilence - 20 февраля 2016, 13:27



3
Код
Armor Property DLC1ClothesMothPriestBlindfold auto

   if(akCaster.IsEquipped(DLC1ClothesMothPriestBlindfold) == 1)
          Debug.MessageBox("EQUPPED...")
   else
          Debug.MessageBox("NOPE")
   endif

Создаю каждый раз новый предмет, надеваю. Скрипт пишет, что не надета.

Form Property DLC1ClothesMothPriestBlindfold auto

Тоже ноль эффекта.

Пробовал еще Game.GetForm(0x020047DA).GetName() - пустая строка

По сути, если бы она существовала, то в игре "help moth 4" выдавало бы хоть какие-нибудь формы (одежды). Но их нет.

Dsion  Offline  Сообщение №1978 написано: 20 февраля 2016, 14:08



NoSilence, 95% вероятности, что это ты просто где-то затупил...
Если есть Armor проперти и ты не забыл её заполнить правильным армором + вызываешь IsEquipped на правильном акторе, то всё там работает...

Добавлено (20 Февраля 2016, 17:08)
---------------------------------------------
Dawnguard же не забыл подключить? :)


Myprism  Offline  Сообщение №1979 написано: 20 февраля 2016, 16:02


Физик


В Скайриме есть такая удобная штука, как уровневые списки (левельные списки). Через них обычно персонажи снабжаются шмотками. Всё бы хорошо, но если мод меняет такой список, то он становится несовместим с другими модами, которые меняют тот же список. Т.е. списки не суммируются (объединяются), а используется либо один, либо другой. Возникает естественное желание модифицировать нужные уровневые списки через скрипт. Благо есть соответствующая команда:
; Add 2 axes to the list at level 5
CoolItems.AddForm(Axe, 5, 2)

Вот только возникает вопрос, как правильнее обновлять уровневые списки? Когда они инициализируются? По какому событию надо запускать скрипт изменения уровневого списка?

andrelo1  Offline  Сообщение №1980 написано: 20 февраля 2016, 16:16 | Отредактировано: andrelo1 - 20 февраля 2016, 16:19



13
NoSilence
Ты сравниваешь ( akCaster.IsEquipped(...) == 1 ). Не уверен, что в папирусе True == 1.
help moth 4 ничего не покажет по двум причинам, во-первых, если у тебя русский скайрим, то команда help будет искать по русским именам (если таковые имеются), во-вторых, параметр "4" заставляет искать точное совпадение, так что в этом случае help ничего скорее всего не найдет и в английском скайриме.
Почему Game.GetForm(0x020047DA).GetName() ничего не выдает, тут непонятно.
Да, и значение свойства DLC1ClothesMothPriestBlindfold нужно в CK установить.

Добавлено (20 Февраля 2016, 19:16)
---------------------------------------------
Цитата Myprism

Вот только возникает вопрос, как правильнее обновлять уровневые списки? Когда они инициализируются? По какому событию надо запускать скрипт изменения уровневого списка?

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

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





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