Модератор форума: 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? Пиши не в ЛС, а в эту тему.
Mengur  Offline  Сообщение №2431 написано: 26 апреля 2017, 08:40



12
Dsion, да это понятно дело. У меня вообще ощущение, что в моем скрипте переменная предыдущего урона одна общая на всех, и постоянно меняется. Хотя хз, как это проверить. С настройками будет гораздо лучше вариант=)

Я просто обдумываю будущий фронт работ и изучения=)

nepewka  Offline  Сообщение №2432 написано: 26 апреля 2017, 18:07



255
Всем привет. Не подскажите какой скриптовой командой можно заставить актёра съесть ингридиент/пищу ?

AlexeyVN  Offline  Сообщение №2433 написано: 26 апреля 2017, 18:33



52
nepewka, Попробуйте вот так - Игрок.EquipItem(ингредиент)

nepewka  Offline  Сообщение №2434 написано: 26 апреля 2017, 21:55



255
не варик, мне нужно чтобы на любом актёре это работало, а не только на игроке.
и еквипитем вот так просто работать не будет

Mengur  Offline  Сообщение №2435 написано: 26 апреля 2017, 23:02



12
nepewka, Точно нет возможности проверить, но может профит будет в пакетах АИ? Неписи же хавают зачастую. Все это игра организует пакетами. А пакет, насколько я помню, можно вызвать скриптом.

Синтаксиса сейчас не припомню, так как на работе, но суть такая была бы:

===
Событие - предмет добавляется в инвентарь цели
Цель получает пакет сожрать предмет
Конец события
===

Dsion  Offline  Сообщение №2436 написано: 27 апреля 2017, 06:37 | Отредактировано: Dsion - 27 апреля 2017, 06:39



Цитата nepewka

и еквипитем вот так просто работать не будет


На твоем месте, я бы все-таки попробовал. Всё тебе правильно подсказали. Моментально и с эффектом - EquipItem. А если долго и для красоты - то через пакет.

nepewka  Offline  Сообщение №2437 написано: 27 апреля 2017, 11:00



255
Спасибо.
Да я как-то сомневался, как еквипитем может заработать, если а)предмета в инвентаре нет
б)в коде не написан слот, куда одевать
в)сам по себе скрипт этот хочу впихнуть в магический эффект, чтобы от аое взрыва спелла/энчанта на группу актеров, через команду target можно было всех заставить скушать этот ингредиент/пищу

Mengur  Offline  Сообщение №2438 написано: 27 апреля 2017, 20:39 | Отредактировано: Multigone - 22 апреля 2020, 15:58



12
nepewka,

Погоди. Неписи под воздействием скрипта кушают необходимый ингредиент, если он есть у них в инвентаре? Или они должны есть его даже если у них этого ингредиента нет?

Если должны есть в любом случае, то перед самим поеданием можно им в инвентарь его добавить. Если же только те, у кого есть, то добавить проверку на наличие предмета в инвентаре, и если она успешна, уже поедать.

Еще вариант (не знаю, насколько он актуален в твоем случае): Если не нужна анимация самого поедания, а важен сам эффект, то можно на магический эффект вместо скрипта поедания повесить скрипт с аналогичным эффектом, действующим при поедании необходимого ингредиента =)



Еще вопросы к скриптерам. Кто занимался игровыми настройками. Нашел настройку урона физического оружия. : fDamageWeaponMult

А вот настройку для увеличения урона от магических эффектов так и не обнаружил. Может кто находил?

Также хочу увеличить урон именно от луков. Но тоже не нашел никаких подобных усилителей в настройках. (fDamageWeaponMult увеличивает урон и там, и там. Но быть может есть еще настройки разделения)

Есть мысли, конечно, тупо увеличить урон от самих стрел. Но на крайний случай.

Хотя через тот корявый скрипт, что я запихивал в Actor, ощущается гораздо круче. Пусть там кривое чтение урона, но все равно надо искать варианты внедрения этого скрипта. Буду рыться.

KAS_Programmer  Offline  Сообщение №2439 написано: 30 апреля 2017, 12:00



6
Кто подкинет скрипт, для добавления заклинания, когда игрок входит в триггер?

Aksyonov  Offline  Сообщение №2440 написано: 30 апреля 2017, 13:01 | Отредактировано: Aksyonov - 30 апреля 2017, 13:04



937
Цитата KAS_Programmer

Кто подкинет скрипт, для добавления заклинания, когда игрок входит в триггер?


Держите старина:

Spell Property AddedSpell Auto
Actor Property igrok  Auto

Event OnTriggerEnter(ObjectReference akActionRef)  ;- Произошло событие - вход в зону триггера
igrok.AddSpell(AddedSpell)

EndEvent


В Property igrok выберите: Cell = Any - а Reference = PlayerRef ('player')
А в Property Spell соответственно то заклинание которое вам нужно.

Таким образом заклинание будет добавляться игроку давакину или давакинКе  ok

Dsion  Offline  Сообщение №2441 написано: 30 апреля 2017, 21:55



По-моему, этот ивент срабатывает и при попадании предметов туда. Даже если тарелка туда упадет.

Mengur  Offline  Сообщение №2442 написано: 1 мая 2017, 11:27



12
Ребят. Может кто знает, как вообще игра обрабатывает скрипты? (делаю все для skyrim special. возможно из-за этого не работает)

Суть в том, что вообще не могу понять, как и когда скрипты запускаются. Добавил в актера player заклинание для теста. Оно не появилось. Добавил ему скрипт, который должен выводить сообщение после загрузки сохранения. Тоже голяк. Скрипт был вот такой, но ни одно из событий не сработало:

Scriptname _1MgGGMMainStartScript

event OnPlayerLoadGame ()
Debug.MessageBox("***енно, оно заскриптовалось!")
endevent

event OnPlayerBowShot(Weapon akWeapon, Ammo akAmmo, Float afPower, Bool abSunGazing)
Debug.Notification("***енно, оно все-же заскриптовалось!")
endevent

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

Dsion  Offline  Сообщение №2443 написано: 1 мая 2017, 12:02



Mengur, нечего модифицировать ванильные записи без нужды... Создаешь квест, Start Game Enabled, создаешь в нем алиас на игрока. И уже на алиас вешаешь скрипт или заклинания. И работать будет, и совместимость 100%.

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

Код
coc whiterunbanneredmare

или другое место на твой вкус. Это мгновенно начинает новую игру и телепортирует игрока в указанное место. Если работаешь над модом со скриптами, его желательно каждый раз тестировать на новой игре или на сохранении, в котором мод еще не был подключен. Иначе могут, например, не поменяться property на скриптах.

AlexeyVN  Offline  Сообщение №2444 написано: 8 мая 2017, 17:20 | Отредактировано: AlexeyVN - 8 мая 2017, 17:21



52
Здравствуйте, помогите пожалуйста разобраться.

Проблема в том что когда делаю так -  Debug.Notification("Персонаж ещё восстанавливается")    - сообщение нормально отображается в игре
а когда так -  String SelfName = Self.GetBaseObject().GetName()
                      Debug.Notification(SelfName + " ещё восстанавливается")    -то сообщение отображается не корректно

Может кто нибудь прольёт свет на эту проблемку?

Lexo  Offline  Сообщение №2445 написано: 13 мая 2017, 08:51


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


223
Даже не знаю, куда именно написать... в общем, не подскажете, как сделать, что бы в Скайриме у врага можно было снизить силу заклинаний?
Есть, конечно, вариант через перк, но тогда этот перк надо будет всунуть каждому НИПу в игре (к тому же, на НИПов из других модов это не подействует).
Не знаете, есть ли способ сделать это? Средствами СК или скриптами...

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

GreyLis  Offline  Сообщение №2446 написано: 31 мая 2017, 19:44



4
Можете подсказать один скрипт? Нужно, чтобы после прочтения записки/книги, в одно место, где гг прочитал записку/книгу, телепортировался специальный НПС, и первый начал диалог. Еще желательно, чтобы когда нпс телепортировался, нужно чтобы появился визуальный эффект призыва из обливиона т.е как мы призываем обычного питомца через заклинание! Буду очень благодарен!  unsure

Aksyonov  Offline  Сообщение №2447 написано: 15 июня 2017, 16:19 | Отредактировано: Aksyonov - 11 июня 2017, 18:15



937
Всем привет, нужно помощь с советом, написал такой скрипт ↓
задача воскресить при помощи заклинания мертвый трел
24 NPV - одержимых, когда кастует заклинание игрок, всё
в порядке - когда выбираю в качестве источника каста
источник света или любой другой объект каст заклинания
происходит но труп не встает, мысли такие, наверняка
скрипт заклинания присваивает оживленный труп в
качестве компаньона для игрока поэтому и не работает,
правильно ли всё я понимаю? И как воскресить огромное
количества NPC разом лучше всего? Нужен эффект что бы
подымались и воскресали. Как в оригинальном заклятье.


Scriptname SilviScriptQuestZombi extends ObjectReference
Quest Property jr Auto

spell  Property zap Auto
actor  Property fa Auto
ObjectReference Property ac Auto


Quest Property SilviaQuest Auto
Event OnTriggerEnter(ObjectReference akActionRef)
Zap.Cast(ac, fa)
if akActionRef == Game.GetPlayer() && SilviaQuest.GetStage() == 35

SilviaQuest.SetObjectiveCompleted(35)
SilviaQuest.SetObjectiveDisplayed(40)
SilviaQuest.SetStage(40)

endif
EndEvent

Добавлено (15 Июня 2017, 19:19)
---------------------------------------------
Всем привет кто нибудь знает как можно скриптом заставить сказать npc определенную реплику из квеста? Допустим сразу после каста заклинания, очень нужно! Помогите!


MagicalDagger  Offline  Сообщение №2448 написано: 21 июня 2017, 17:00 | Отредактировано: MagicalDagger - 21 июня 2017, 17:11



48
Всем привет!
Подскажите, пожалуйста, как работают функции Int GetEnchantmentValue() и SetEnchantmentValue(Int value). Они работают с максимальным или текущим значением уровня зачарования? На сайте редактора нет информации по ним (функции из SKSE), а опытным путем выяснять дольше выйдет.

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

Aksyonov, дело не в самом заклинании точно, так как висящий на эффекте скрипт управляет топиком, который произносит дружественный персонаж при применении заклинания на него (если это именно "Мертвый трелл"). Возможно, дело в архетипе эффекта, а как откопать его реализацию, лично я не в курсе.

m4mk203  Offline  Сообщение №2449 написано: 23 июня 2017, 12:16 | Отредактировано: Multigone - 22 апреля 2020, 15:45



29
Привет всем.

В первую очередь спасибо за огромное количество полезнейшего материала по скриптингу.

Вопрос.
Есть локация. В ней сундук. На сундуке скрипт с защитным проклятием. Срабатывает эта пакость на событии OnClose сундука. В данный момент схема срабатывания вероятностная. Что нужно: как корректно отследить в момент закрытия сундука тот факт, что ГГ что-то из него взял / не взял? Что именно он взял значения не имеет. Важно только лутали ли сундук вообще или содержимое осталось нетронутым. Отловить это нужно именно в событии закрытия.

Будет ли правильным такое решение в скрипте на сундуке:
Код
Bool WasLooted = False ; флаг лутался ли сундук

Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
   If  akDestContainer == Game.GetPlayer()
      WasLooted = True
   EndIf
endEvent

Event OnClose(ObjectReference akActionRef)
   If WasLooted == True
      ; контейнер был полутан - выполняем нужные действия.
   endif
endEvent

Dsion  Offline  Сообщение №2450 написано: 23 июня 2017, 13:48 | Отредактировано: Dsion - 23 июня 2017, 13:49



m4mk203, да, вроде, нормально всё... Если OnClose срабатывает при закрытии... Должно работать. Не работает разве?

Если даже OnClose не срабатывает, то можно каст бяки повесить прямо на OnItemRemoved после Utility.Wait(0.1) - тогда она скастуется сразу после закрытия игроком меню сундука.

Если сундук должен быть многоразовым, можно добавить сбос переменной в OnActivate.

m4mk203  Offline  Сообщение №2451 написано: 23 июня 2017, 14:08



29
Dsion, работает. Я просто еще слабенько знаком с взаимосвязью ивентов и консультируюсь на тему правильный ли набор событий я использую для решения задачи. То, что она работает сейчас, не грантирует работу всегда :) Спасибо Вам за ответ.

Цитата Dsion

Если сундук должен быть многоразовым, можно добавить сбос переменной в OnActivate.

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

Еще такой момент. Как правильно реализовать следующую штуку:
Если ГГ таскает в инвентаре драконий коготь от еще не открытой двери могильника, то его неким образом плющит. Если дверь уже открыта, то коготь безвреден. Очень хотелось бы избежать постоянных проверок инвентаря и вкл/отк пакости повесить на события касающиеся исключительно взятия / выбрасывания когтя.

Dsion  Offline  Сообщение №2452 написано: 23 июня 2017, 17:28



m4mk203, а коготь твой собственный или ты для всех когтей такое хочешь сделать? Да вариантов дофига...

Если твой собственный, то есть же событие OnContainerChanged - можно повесить скрипт на коготь и этот ивент будет срабатывать при смене контейнера. Можно проверить, является ли "контейнер" игроком.

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

Ну и если это часть квеста, можно еще на алиас игрока повесить вредящую ability (пассивный эффект), с условием "коготь в инвентаре, дверь не открыта".

Фигово. да? Лично я не люблю, когда много вариантов :) Сложно выбрать. Когда вариант только один, как-то легче.

m4mk203  Offline  Сообщение №2453 написано: 24 июня 2017, 18:09



29
СПАСИБО!

Ага. Суть понял. Да, когти игровые и больше всего подойдет вариант отработки смены контейнера на самом когте.

Умаялся с этими дверями для когтей. Оказывается это не единый объект, а целая лесопарковая зона:) Я так понимаю, что состояние открыта/закрыта должно храниться в глобальных переменных? И к сожалению сами когти это просто болванки в мискайтемах без явной привязки к двери. Придется видимо прописывать двери для каждого когтя ручками в скриптах.

А в каком месте лежит скрипт, отвечающий за спавн драугров в данжах? К чему вопрос: нужно изменить спавн так, что пока гг ниже 50-го уровня в данжах могильников спавнится нечисть уровня 50 (знаю что жесть но так надо), а если гг достиг уровня 50 то спавнится нечисть с левелом = уровень гг + 5. Такое вобще возможно?

И еще вопрос по спавну. Есть созданный мною сундук. В какой-то момент игрового времени туда попадают вещи. Нужно чтобы через 3 игровых дня с момента попадания в сундук шмота (если гг не забрал шмот из этого сундука) он автоматом очищался в ноль.
Возвращать шмот игроку не нужно. Просто очистить сундук.

З. Ы.

На мой вкус куча вариантов - это хорошо :) Больше свободы действий.

Dsion  Offline  Сообщение №2454 написано: 24 июня 2017, 22:56 | Отредактировано: Dsion - 24 июня 2017, 22:57



m4mk203, по поводу спавна нежити - так скрипты там, вроде, вообще не при чем. Думаю надо смотреть, LeveledCharacter. Это списки, в которые добавляются обычные НИП (акторы) и для каждого задается уровень игрока. У тебя, наверное, получится только два актора в списке: один со статическим 50 уровнем, а второй с уровнем игрока +5. Да, точно можно сделать и даже не сложно.

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

За сундук - так это легко. Когда вещи попадают, выполняешь RegisterForSingleUpdateGameTime -  это заставит через указанное время (игровое) вызваться ивент OnUpdate(). А в ивенте OnUpdate() делаешь RemoveAllItems().

m4mk203  Offline  Сообщение №2455 написано: 25 июня 2017, 10:18



29
Он вообще отменяет концепцию "уровня игрока" и зависимость мира от уровня игрока. У игрока уровня нету, есть только уровень навыков. А в мире с самого начала лазят монстры от 1 до 100 уровня.
Аминь, брат!  :D 

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

Dsion  Offline  Сообщение №2456 написано: 25 июня 2017, 12:17



m4mk203, а, ну давай...

Скорее всего, придется тебе дофига leveled-списков редактировать: и LeveledCharacter, и LeveledItem. Посмотри их хоть, попробуй разобраться, как они работают.

Я не поклонник перезаписи ванильных объектов в т.ч. списков, но в данном случае это оправданно.

Ну или еще, если есть в тебе олдскульный программистский дух, можешь почесать репу над вариантами, не требующими перезаписи ванильных объектов.
Вот для примера (я не предлагаю что-то подобное делать, а просто для примера):
Есть задача: усилить всю нежить во всех подземельях.
Вариант 1: Редактируем дофига leveled-списков и Actor'ов. Мод становится тяжелым и не (полностью) совместимым с любым другим модом, затрагивающим хоть один из этих же списков.
Вариант 2: Создаем всего один перк и даем его игроку. А в перке прописываем увеличить весь входящий урон по игроку в нордских руинах в 4 раза, а весь исходящий (по монстрам) - уменьшить в 4 раза. Весь - это чтоб и ловушки стали опаснее. Но можно увеличить урон только от нежити. В том же духе решаем и проблему с лутом.

m4mk203  Offline  Сообщение №2457 написано: 25 июня 2017, 13:49



29
Dsion, согласен, курочить родную отбалансированную систему спавна нефиг. Но и обвешивать гг приблудами тоже не очень хочется.

Пока общую картину вижу для себя так:


Dsion  Offline  Сообщение №2458 написано: 25 июня 2017, 14:45 | Отредактировано: Dsion - 25 июня 2017, 14:47



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

А, ладно, забей. Это у меня мозги набекрень. Я страшные вещи делал, чтоб избежать кропотливой работы и перезаписи ванильных объектов :)

Нарада  Offline  Сообщение №2459 написано: 25 июня 2017, 18:45 | Отредактировано: Нарада - 25 июня 2017, 18:48



129
Цитата m4mk203

Доступ к ключевым дверям защищен кил-тригером

Не могли ли подробней на сием методе? Что-то я не совсем понимаю... Это чтобы исключить открытие двери читом?

m4mk203  Offline  Сообщение №2460 написано: 25 июня 2017, 20:45



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

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





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