Модератор форума: 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? Пиши не в ЛС, а в эту тему.
evTau  Offline  Сообщение №2011 написано: 23 февраля 2016, 12:45



Цитата Myprism

andrelo-1, спасибо большое! GetLeveledActorBase() решило мою проблему. С RaceMenu буду разбираться позже, а пока у меня есть всё, что нужно, чтобы выложить первую версию нового мода.

Если HH переводить на новую систему прийдеться всю обувь исправлять под нее. Если речь идет о  NiOverride High Heels.

Myprism  Offline  Сообщение №2012 написано: 23 февраля 2016, 18:35 | Отредактировано: Myprism - 23 февраля 2016, 18:37


Физик


evTau, а зачем переделывать? Я не вижу недостатков в существующей системе. Использование скриптов это не недостаток. На этом игра построена и они входят внутрь мода. У меня обязательное условие - мод не должен требовать ничего, кроме SKSE. У меня моды не требуют даже дополнений к Скайриму.
Да и существующая система столь проста, что там и делать ничего не надо. Нужен высокий каблук - просто пристёгивается к сапогам скрипт в два клика. Не нужен каблук - скрипт удаляется в один клик.

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



Цитата Myprism

evTau, а зачем переделывать? Я не вижу недостатков в существующей системе. Использование скриптов это не недостаток. На этом игра построена и они входят внутрь мода. У меня обязательное условие - мод не должен требовать ничего, кроме SKSE. У меня моды не требуют даже дополнений к Скайриму.Да и существующая система столь проста, что там и делать ничего не надо. Нужен высокий каблук - просто пристёгивается к сапогам скрипт в два клика. Не нужен каблук - скрипт удаляется в один клик.

Я о том что если отказыватся от HH и переходить на NiOverride High Heels. Если оставатся на нем то и обувь тогда не надо трогать  :)

PS: Ваш мод как магнит собрал всех детей мг в комментах  :D

erlick  Offline  Сообщение №2014 написано: 29 февраля 2016, 00:43



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

Event OnDeath(Actor akKiller)
 if Actor.IsInFaction(DragonFaction)
     Game.GetPlayer().AddItem(Gold001, 10)
   endIf
 EndEvent

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

Multigone  Offline  Сообщение №2015 написано: 29 февраля 2016, 03:16 | Отредактировано: Multigone - 29 февраля 2016, 09:27



832
erlick, мне приходят на ум два пути решения этого вопроса:

1) Быстрый и плохой:

В папке Scripts \ Source найти исходник скрипта MQKillDragonScript, обязательно сделать его бэкап, открыть оригинал, найти там текст...
Код
GetPlayer().modActorValue("dragonsouls", VoicePointsReward)
...следующей строкой добавить...
Код
Game.GetPlayer().AddItem(Game.GetForm(0xF), 10)
Сохранить исходник.
Скомпилировать MQKillDragonScript средствами СК.
Заменить оригинал бэкапом (чтобы MQKillDragonScript.psc не содержал никаких изменений).
Теперь, пока MQKillDragonScript.pex находится в Data \ Scripts, убийство драконов будет приносить прибыль.

2) Медленный, нормальный и, возможно, неработоспособный:

Создать квест, на вкладке Quest Data в строке Event указать Kill Actor Event. Добавить во вкладку Scripts скрипт:

Код
ScriptName _MyName Extends Quest

Faction Property DragonFaction Auto
MiscObject  Property Gold001 Auto

Event OnStoryKillActor(ObjectReference akVictim, ObjectReference akKiller, Location akLocation, int aiCrimeStatus, int aiRelationshipRank)
    if akKiller == Game.GetPlayer() && (akVictim as actor).IsInFaction(DragonFaction)
        akKiller.AddItem(Gold001, 10)
        stop() ; Dsion
    endif
endevent
Заполнить DragonFaction и Gold001.
В СК в разделе Character -> SM Event Node найти Kill Actor Event и добавить туда созданный квест.
Сохранить .esp.
Теперь, когда игрок убивает актера, находящегося в указанной фракции, он мгновенно получает прибыль. Чтобы ее получение совпадало с поглощением души, скрипт нужно усложнять.

PS: Может, кто-нибудь знает, как отследить смерть дракона др. способом.

Dsion  Offline  Сообщение №2016 написано: 29 февраля 2016, 05:27 | Отредактировано: Dsion - 29 февраля 2016, 05:28



Ну есть еще стат "Dragon Souls Collected"... Можно было бы попробовать RegisterForTrackedStatsEvent() и Event OnTrackedStatsEvent(string asStat, int aiStatValue)... Но это отстой...
Лучше, наверное, второй вариант Multigone. Как пример можно посмотреть квест MGSuspensionQuest - он запускается, когда игрок убивает члена гильдии магов. И, наверное, надо не забыть сделать так, чтоб квест останавливался после выдачи денег. А то может не запуститься в следующий раз.

Добавлено (29 Февраля 2016, 08:27)
---------------------------------------------
О, а еще можно с помощью перка сделать так, чтоб всем мертвым драконам в инвентарь добавлялось любое количество золота или других предметов.
Или чтоб игрок мгновенно получал золото при активации драконьего трупа.

erlick  Offline  Сообщение №2017 написано: 29 февраля 2016, 18:46 | Отредактировано: erlick - 29 февраля 2016, 19:09



18
Multigone,  оба способа не сработали, в первом случае даже душа даваться не стала, во втором вообще ничего не произошло.

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


Multigone, а нет, второй способ работает!!! Изначально забыл внести его в SM Event Node. После исправления ошибки все заработало! Огромное спасибо!

Dsion  Offline  Сообщение №2018 написано: 1 марта 2016, 06:43



С перками там никакой проблемы. Даже два варианта есть: 1) перехватить активацию, если это труп именно дракона 2) добавить деньги в инвентарь, опять же, если это труп дракона

Multigone  Offline  Сообщение №2019 написано: 1 марта 2016, 09:31 | Отредактировано: Multigone - 1 марта 2016, 09:33



832
Dsion, имеешь в виду, через Entry -> Activate? Там же сообщение с выбором должно появляться? Не проще добавить деньги в инвентарь дракону через DeathItemDragon01?
Еще можно использовать SKSE (RegisterForCrosshairRef() + RegisterForMenu("ContainerMenu")). В смысле, добавлять деньги трупу дракона, не трогая вообще ничего.

Dsion  Offline  Сообщение №2020 написано: 1 марта 2016, 10:07 | Отредактировано: Dsion - 1 марта 2016, 10:16



Сообщение с выбором - опциональное... И еще там есть что-то типа add leveled list on death - если дать игроку такой перк без условий, то всем убитым NPC будут заданные предметы добавляться в инвентарь.

evTau  Offline  Сообщение №2021 написано: 2 марта 2016, 13:29



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

andrelo-1  Offline  Сообщение №2022 написано: 2 марта 2016, 17:56



172
evTau, Player.AddToFaction() / Player.RemoveFromFaction()

evTau  Offline  Сообщение №2023 написано: 3 марта 2016, 06:21



Цитата andrelo-1

evTau, Player.AddToFaction() / Player.RemoveFromFaction()

Это то понятно... я что то дико туплю и у меня не фига не получается заставить зелье работать. То есть выпил зелье на 1 игровой час игрок в какой то фракции, а через час удаляется из нее, как только эффект от зелья закончился.

Dsion  Offline  Сообщение №2024 написано: 3 марта 2016, 07:28



evTau, посмотри скрипт DA08FriendshipEffect.psc

evTau  Offline  Сообщение №2025 написано: 3 марта 2016, 17:45



Цитата Dsion

evTau, посмотри скрипт DA08FriendshipEffect.psc

Впринципе да, но все оказалось сложнее чем я думал, по этому пока решил забить на эту идею. Но спс за наводку.

Нарада  Offline  Сообщение №2026 написано: 8 марта 2016, 19:59 | Отредактировано: Нарада - 8 марта 2016, 20:00



129
Уважаемые знатоки, не могли ли вы ответить мне на следующий вопрос.
Взаимодействует ли маркер XMarkerHeading с Актером, когда тот подходит к нему в режиме пакета Travel. Я пробовал определить событием OnPackageChange(Package akOldPackage)
Но ничего не получилось. Можно, правда, поставить Триггер, но может быть есть како-нибудь событие на данное действо?
Для чего это надо?
Чтобы при достижения Актера маркета поменять ему пакет.

Dsion  Offline  Сообщение №2027 написано: 8 марта 2016, 20:21



Я сам не пробовал, но у пакетов, вроде, есть три типа ветки: stacked, когда выбирается первая процедура, удовлетворяющая условия, sequence, когда (как я думаю) процедуры выполняются по порядку и simu-что-то там, когда они выполняются одновременно.

Nameless0ne  Offline  Сообщение №2028 написано: 11 марта 2016, 14:12



1
Вот в этом видео рассказывается как создать собственный пакет с sequence. Видео правда на английском.


erlick  Offline  Сообщение №2029 написано: 13 марта 2016, 00:57



18
Задача: сделать сундук, который открывался бы каждый раз после определенной фразы в диалоге с определенным НПС (спутником), причем из любого места в игровом мире. Сделал и спрятал сундук, сделал квест, сделал алиас на сундук, прописал диалог, указал на диалоге целью НПС. Добавил в окончание диалога скрипт:

GetOwningQuest().SetStage(5)

В стадии 05 квеста поставил галочку на окончание квеста, прописал скрипт:

Alias_Chest.GetReference().Activate(Game.GetPlayer(), true)

Все компилится, сохраняется, но не работает. Вопрос: почему? Заранее благодарен за ответ.

Dsion  Offline  Сообщение №2030 написано: 13 марта 2016, 01:46



erlick, 95% вероятности, что это ты где-то подзатупил...
Функция Debug.MessageBox() поможет найти, где именно.

Можно в окончание диалога временно добавить Debug.MessageBox("1") и узнаешь, вызывается ли этот фрагмент скрипта.
Потом можно в стадию 05 добавить Debug.MessageBox(Alias_Chest) - узнаешь, срабатывает ли этот фрагмент и не забыл ли ты заполнить проперти алиаса (должно писать не None).
Туда же потом можно Debug.MessageBox(Alias_Chest.GetReference()) - узнаешь, действительно ли сундук находится в алиасе. Ну а Activate должно сработать с любого расстояния - это я использовал уже.

Наверное, ты знаешь, но еще добавлю, что алиас (и стадию) использовать не обязательно. Можно прямо к скрипту на диалоге добавить ObjectReference проперти ChestRef и там же вызвать ChestRef.Activate(Game.GetPlayer())

erlick  Offline  Сообщение №2031 написано: 14 марта 2016, 01:22 | Отредактировано: erlick - 14 марта 2016, 01:28



18
Dsion, спасибо за совет. Изначально я так и собирался, одним скриптом, без алиасов и стадий, но, без прописанных свойств ,в диалоге, скрипт не хотел компелится, а при неправильной комппиляции скрипт не создавался в диалогах, а как следствиена него нельзя было повесить свойства. Выход был таким, сначала создать скрипт:

GetOwningQuest().SetStage(5)


А потом, после удачной компиляции,  удалить вышенаписанный скрипт, пятую стадию квеста, навесить на скрипт свойство ObjectReference с ссылкой на сундук и прописать скрипт:

ChestRef.Activate(Game.GetPlayer())

Все заработало. За что я премного благодарен)) В том, что я неправильно сделал с алиасом и стадиями, я  не разбирался. И есть подозрение, что постоянное завершение квеста постепенно раздувало бы сохранение и скрипты, прописанные в сохранении, что со временем повлияло бы на качестве игры. Так что вариант без алиаса и стадии я считаю оптимальным. Спасибо за помощь!)

Нарада  Offline  Сообщение №2032 написано: 14 марта 2016, 17:40



129
Уважаемые знатоки, 
Для определения смерти Актера имеется событие Event OnDeath(Actor killer). Скрипт с этим событием, как я понимаю, вешается на самого Актера или его Алиас.
Нет ли функции с помощью которой можно было бы определить, что все враги погибли без того чтобы  вешать на каждого скрипт с OnDeath?


Dsion  Offline  Сообщение №2033 написано: 14 марта 2016, 18:27



IsDead(), конечно

Нарада  Offline  Сообщение №2034 написано: 15 марта 2016, 09:28



129
У меня еще вопрос: пытаюсь добавлять Outfit
Prisoner.SetOutfit(RagsOutfit)
Но, одежда в инвентаре появляется и даже как-бы активна.
Вот только ГГ в нигляже, то есть в одних подштанниках.
Не подскажите как исправить сие безобразие?

andrelo-1  Offline  Сообщение №2035 написано: 15 марта 2016, 13:26 | Отредактировано: andrelo-1 - 15 марта 2016, 13:27



172
Нарада, видимо с самим оутфитом что-то не так, должно работать, попробуйте с другим оутфитом.

Myprism  Offline  Сообщение №2036 написано: 15 марта 2016, 16:06


Физик


Нарада

Prisoner.GetActorBase().SetOutfit(RagsOutfit)
Prisoner.QueueNiNodeUpdate()

erlick  Offline  Сообщение №2037 написано: 24 марта 2016, 10:56



18
Как можно реализовать перенос всех предметов из одного контейнера в другой?  Хотя бы пните в нужном направлении)

Dsion  Offline  Сообщение №2038 написано: 24 марта 2016, 12:07



Да запросто.. Вот этим
http://www.creationkit.com/RemoveAllItems_-_ObjectReference

erlick  Offline  Сообщение №2039 написано: 25 марта 2016, 10:41



18
Dsion,  ох блин! А  пользовался этим только для удаления вещей, даже и помыслить не мог, что оно еще и переносить. Мои мысли блуждали куда-то в сторону фромлистов и глобальных переменных. Большое спасибо!

Добавлено (25 Марта 2016, 13:11)
---------------------------------------------
NPC.RemoveAllItems(Chest) - не работает (( Свойства и сундука и нпс прописаны, причем нпс прописывал и как ObjectReference и как Actor. Строчка написана в теле скрипта квеста (Extends Quest Hidden), полный фрагмент выглядит так:

;BEGIN FRAGMENT Fragment_3
Function Fragment_3()
;BEGIN CODE
_00IoHuman1.RemoveAllItems(_00IoItemChest)
SetObjectiveCompleted(20)
SetObjectiveCompleted(30)
SetObjectiveDisplayed(40)
_00IoHuman.RemoveFromFaction(PotentialFollowerFaction)
;END CODE
EndFunction
;END FRAGMENT

Фракция удаляется, цели квеста меняются, вещи с НПС удаляются, а в сундуке не появляются. Где у меня лыжи не едут?

Добавлено (25 Марта 2016, 13:41)
---------------------------------------------
Разобрался. Скрипт не срабатывал из другой локации. Перенес активатор скрипта в локацию с сундуком - все заработало.


Lexo  Offline  Сообщение №2040 написано: 25 марта 2016, 13:48


Всепознающий мододел


223
Народ, у меня такой вопрос... возможно кто-то уже писал что-нибудь подобное, но поиск по форуму ничего не дал...

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

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

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





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