Модератор форума: 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? Пиши не в ЛС, а в эту тему.
DarkVetal  Сообщение №481 написано: 2 ноября 2013, 13:17

AleksTirex, именно все так и сделал, никто так и не сдох, хотя бегали раз по десять через него.

AleksTirex  Offline  Сообщение №482 написано: 2 ноября 2013, 13:46


Архимаг


371
Цитата DarkVetal

именно все так и сделал, никто так и не сдох, хотя бегали раз по десять через него.



Ты заметь, что у тебя вообще ни один свой созданный триггер не работает, ни на убийство, ни на дверь...
Команда Kill() не может не убить простого НПС.
У тебя проблема с самими триггерами или с их созданием.
 
Добавь в скрипт такую строку:
 
Event OnTriggerEnter(ObjectReference akActionRef)
  debug.notification("Trigger Enter!")
  ...
EndEvent
 
И будет видно, срабатывает ли вообще твой триггер. При срабатывании триггера появится такое сообщение сверху экрана.
 
 
Код
как только одну шмотку выкинуть


http://www.creationkit.com/RemoveItem_-_ObjectReference

Монах13  Offline  Сообщение №483 написано: 2 ноября 2013, 13:56



5

http://www.creationkit.com/RemoveItem_-_ObjectReference
там уже всё облазил
смотрел скрипт внизу в той теме, где, вроде, перебор шмоток идёт и они выкидываются, но не так силён в этой среде программирования...

В итоге не могу написать свой скрипт, который бы просто выкинул в цикле всё ВОЗМОЖНОЕ моё добро в некий ящик. В игре камень барензии не выкидывается в ручную,  а скрипту почему-то пофиг.

Добавлено (02 Ноября 2013, 17:56)
---------------------------------------------
Хотя нашёл выход)
Установил в моде, чтобы не терялись шмотки. А после респа в храме - ЧЕСТНО складываю всё возможное добро в ящик)))


Человек - смертный Бог!
DarkVetal  Сообщение №484 написано: 2 ноября 2013, 14:21 | Отредактировано: DarkVetal - 2 ноября 2013, 14:45

AleksTirex, заработало, только дети, ГГ и квестовые персонажи не дохнут, а остальные вполне с первого раза отправляются в мир иной.
Есть ли возможность убивать всех, или это делается только снятием галочки у персонажей?
P.S. Дракон тоже не умер.

AleksTirex  Offline  Сообщение №485 написано: 2 ноября 2013, 14:47


Архимаг


371
DarkVetal, да ты читер :D , если ГГ не дохнет. Или ты не убрал условия в скрипте (там было запрещено убивать ГГ), или играешь с TGM.
Чтобы киллить всех и квестовых НПС тоже, надо так:
 
Event OnTriggerEnter(ObjectReference akActionRef)
   (akActionRef as Actor).KillEssential()
EndEvent

 
Но если на НПС стоит галочка Invulnerable, то такого НПС ничем не убьёшь (это галочка "неуязвимый").

*************
Вот только зачем нужных квестовых НПС убивать, не понятно, ведь квесты встанут/зависнут.

DarkVetal  Сообщение №486 написано: 2 ноября 2013, 15:05

AleksTirex, а какие именно условия убрать, чтобы ГГ сдох? А если в условие вставить KillInvulnerable, как поможет?

AleksTirex  Offline  Сообщение №487 написано: 2 ноября 2013, 15:35 | Отредактировано: AleksTirex - 2 ноября 2013, 15:46


Архимаг


371
Цитата DarkVetal

а какие именно условия убрать, чтобы ГГ сдох?



Так постом выше написано, там полный скрипт (событие и одна команда). Вообще никаких условие не надо в скрипте.

KillInvulnerable - такой команды нет.

**************
 
Event OnTriggerEnter(ObjectReference akActionRef)
  bool bInvulnerable
  if (akActionRef as Actor).GetActorBase().IsInvulnerable()
    (akActionRef as Actor).GetActorBase().SetInvulnerable(false)
    bInvulnerable = true
  endIf
  (akActionRef as Actor).KillEssential()
  if bInvulnerable
    Utility.Wait(0.25)
    (akActionRef as Actor).GetActorBase().SetInvulnerable()
  endif
 EndEvent

Gv1n  Offline  Сообщение №488 написано: 4 ноября 2013, 11:35



15
Доброго времени суток всем.
Можно ли как-то запретить фастран и прыжок? Чтобы у игрока не было возможности сбросить idle.

Монах13  Offline  Сообщение №489 написано: 4 ноября 2013, 16:30



5
Не подскажете команды, чтобы при превышении переносимого веса ГГ тупо падал. А после выкидывания хлама - поднимался?

Человек - смертный Бог!
Myprism  Offline  Сообщение №490 написано: 5 ноября 2013, 06:18 | Отредактировано: Myprism - 5 ноября 2013, 12:08


Физик


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

Добавлено (05 Ноября 2013, 10:18)
---------------------------------------------
Ещё, как из скрипта на магическом эффекте запустить произнесение неписью слов из диалога одного из ванильных квестов? Поясню подробнее. Мы можем установить любой квест на любую стадию. Например, квест женитьбы можно поставить на стадию 10 или 20. Но в промежутке идёт диалог с ГГ с потенциальным супругом. ГГ спрашивает, нравится ли он, получает утвердительный ответ, дальше его очередь отвечать. Вот мне нужно то, что произойдёт дальше в случае отказа ГГ. Т.е. мне нужно перевести квест скриптом вот в эту точку отказа главного героя со всеми вытекающими последствиями, главным из которых является текст произносимый отвергнутой невестой (женихом).

Kepper  Offline  Сообщение №491 написано: 6 ноября 2013, 09:53



860
Можно ли без SKSE получить в скрипте список всех предметов в инвентаре актёра/контейнера?

LordVadim  Offline  Сообщение №492 написано: 6 ноября 2013, 13:58 | Отредактировано: LordVadim - 6 ноября 2013, 14:04



139
Цитата Kepper

Можно ли без SKSE получить в скрипте список всех предметов в инвентаре актёра/контейнера?


Посмотри вот этот пример. Там при создании копии актера копируется и весь инвентарь. Если не ошибаюсь, SKSE там не используется.

Kepper  Offline  Сообщение №493 написано: 7 ноября 2013, 04:17



860
Цитата LordVadim

Если не ошибаюсь, SKSE там не используется.


GetNumItems() - SKSE
GetNthForm() - SKSE
GetType() - SKSE

Так что не подходит.

AleksTirex  Offline  Сообщение №494 написано: 8 ноября 2013, 23:49


Архимаг


371
Цитата Kepper

Можно ли без SKSE получить в скрипте список всех предметов в инвентаре актёра/контейнера?



Можно, но геморойно.
Для этого надо удалить/переместить все вещи в другой контейнер, и в этот момент отслеживать события (OnItemRemoved) на удаление предметов. При каждом срабатывании этого события ID записывается в массив. Желательно "организовать очередь" из событий. Потом все вещи возвращаются в исходный контейнер. Если это актёр, то одеваются вещи, которые были до этого одеты.
Это и муторно и некрасиво смотрится.
 
Поэтому тот вариант с SKSE на два порядка проще и удобнее.
 
*****
Не пойму, почему народ боится SKSE?

Myprism  Offline  Сообщение №495 написано: 9 ноября 2013, 04:30


Физик


Цитата AleksTirex

Не пойму, почему народ боится SKSE?

Потому что мод оказывается к нему привязан, т.е. не будет работать у игрока без SKSE. Это право игрока решать, что ему ставить, а что нет. Если моду что нужно, то оно должно быть включено в мод. А вот с SKSE так поступить нельзя, так как он зависит от версии игры. Так что, его использование - безусловный минус. Неизбежное зло, с которым я смирился.

AleksTirex  Offline  Сообщение №496 написано: 9 ноября 2013, 12:19


Архимаг


371
Цитата Myprism

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



Это бесспорно, что ставить и что нет, решает сам игрок. Но причём тут SKSE? Ведь полная аналогия с этим - использование ресурсов из DLC, в этом случае игрок так же вынужден ставить этот DLC для использования мода. Сам же DLC никто не внедряет в свой мод, а просто пишут в требованиях к моду его наличие. Дальше уже сам игрок решает, есть ли смысл ставить этот DLC (если он не стоит), чтобы использовать данный мод.
Точно так же и с SKSE - это простое требование к моду, т.е. это ресурс, которым будет пользоваться мод.
 
Зависимость SKSE от версии игры - полная аналогия с версиями самой игры. Более свежая версия SKSE будет работать со всеми модами, сделанными на ранних версиях.
 
Единственный реальный фактор - это для чего именно делается мод. Если для себя, для своего хобби и своего желания заниматься любимым делом, то какая разница автору, поставит ли "Вася и т.д." этот мод или нет, из-за применения в нём SKSE. Главное, чтобы мод работал именно так, как хочет автор.
Но если мод делать для кого-то или по другим соображениям, тогда да, надо учитывать желания потребителей.


Myprism  Offline  Сообщение №497 написано: 10 ноября 2013, 09:07


Физик


Цитата AleksTirex

Сам же DLC никто не внедряет в свой мод,

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

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

Kepper  Offline  Сообщение №498 написано: 11 ноября 2013, 05:40 | Отредактировано: Kepper - 11 ноября 2013, 06:02



860
Цитата AleksTirex

Не пойму, почему народ боится SKSE?


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

Alliria  Offline  Сообщение №499 написано: 11 ноября 2013, 07:46 | Отредактировано: Alliria - 11 ноября 2013, 07:49



706
Цитата Kepper

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

Это проблема модов. Сам по себе SKSE стабильность не снижает и имеет функцию чистки сейва от некоторых скриптовых событий.)

AleksTirex  Offline  Сообщение №500 написано: 11 ноября 2013, 11:27


Архимаг


371
Цитата Kepper

Тк уже нашел другой способ решения проблемы(без перебора инвентаря).



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

Kepper  Offline  Сообщение №501 написано: 11 ноября 2013, 12:19



860
Ну когда травишься 3 раза подряд с разными модами, то это настораживает. :D
Но раз говорите что SKSE стабильность не снижает, то буду использовать.

Цитата AleksTirex

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


Собственно мне нужен был не сам перебор, а проверка какие вещи одеты в момент снятия вещи.
Ради эксперимента прикручиваю к своему моду одевание трусов и лифа при снятии вещей с мёртвых НПС.
Пока придумал решение: добавить keyword в вещи и проверять наличие этих keyword. Благо НПС используют одежду из моего мода.

Но вопрос все равно оставил, тк это потребуется для еще одной задумки.

AleksTirex  Offline  Сообщение №502 написано: 11 ноября 2013, 12:56


Архимаг


371
Цитата Kepper

Собственно мне нужен был не сам перебор, а проверка какие вещи одеты в момент снятия вещи.  Ради эксперимента прикручиваю к своему моду одевание трусов и лифа при снятии вещей с мёртвых НПС.  Пока придумал решение: добавить keyword в вещи и проверять наличие этих keyword. Благо НПС используют одежду из моего мода.



Ну так это совсем другой вариант, здесь не надо узнавать содержание инвентаря. Всё гораздо проще:
1. Делаешь перк Activate и даёшь ГГ. Условия: если цель == НПС и цель мертва.
2. В перке скрипт, он передаёт референс НПС алиасу, на котором висит скрипт.
3. В этом скрипте событие на снятие предмета. Когда ГГ снимает с НПС шмотку, то это событие отдаёт ID снятой шмотки. Вот её и можно проверить и при совпадении параметров (типа слот боди) одевает на НПС лифт. И т.д.
4. Чтобы отследить закрытие инвентаря, достаточно после команды на назначение НПС алиасу поставить Utility.Wait(1.0), тогда любая команда отработает только после закрытия инвентаря. Этой командой выключаешь режим слежения за снятием шмоток (алиас.Clear()).
 
И не надо SKSE. ;)
 
********
Возможно, и вторая задумка может быть реализована на другом принципе, это уже от самой задумки зависит.
 

 


mayor  Offline  Сообщение №503 написано: 12 ноября 2013, 06:22 | Отредактировано: mayor - 12 ноября 2013, 06:24



194
помогите пожалуйста решить проблему..
у меня есть 24 кнопки (каждая кнопка своя музыка) вот скрипт



проблема в том,что музыка не играет при нажатии на кнопку.на каждой кнопке свой скрипт только с измененной добавляемой песней,в свойствах все песни указаны,в music type галочки Abrupt Transition и Plays One Selection выставлены (пробовал разные вариации),песни созданы верно в xwm формате (на другом скрипте они в игре воспроизводились),дефолтную комбат музыку кнопки выключают (как и должно быть),приоритет у всех треков максимальный,пробовал старые сохранения и новую игру.в чем может быть проблема?почему не воспроизводится моя музыка в игре?

Kepper  Offline  Сообщение №504 написано: 12 ноября 2013, 09:19 | Отредактировано: Kepper - 12 ноября 2013, 09:20



860
Цитата AleksTirex

1. Делаешь перк Activate и даёшь ГГ. Условия: если цель == НПС и цель мертва.
2. В перке скрипт, он передаёт референс НПС алиасу, на котором висит скрипт.


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

В скрипте можно объявлять хранить переменные. Например

Стоит ли избегать таких переменных?
Не останутся ли они в сейве если будет отключен мод?

LordVadim  Offline  Сообщение №505 написано: 12 ноября 2013, 11:15 | Отредактировано: LordVadim - 12 ноября 2013, 11:29



139
Всем привет!
Как проверить есть ли в определенной точке координат пол (твердая поверхность), или там пустота?
И еще: есть ли возможность создать глобальный массив типа Actor. И, если массив можно создать, то как его правильно удалить при необходимости, чтоб не портил сейв.

valambar  Offline  Сообщение №506 написано: 15 ноября 2013, 09:20



513
Задавал вопрос, но он остался без ответа, насчет того, как написать скрипт для активатора, открывающего фасттревел только для определенных локаций (точнее, маркеров карты). Сам нашел, что существует команда AddtoMap, с параметрами true и false, то есть она открывает доступный или недоступный для фасттревела маркер. Теперь остается следующее - получается, что фасттревел надо отключать всегда и включать только при активации активатора. Это первое. А второе - пока непонятно, как лучше - отключать возможность фасттревела ко всем маркерам, кроме избранных, скриптом или же изменить их атрибуты в конструкторе, чтобы они были недоступны для фасттревела. В общем, поделитесь мыслями.

Myprism  Offline  Сообщение №507 написано: 16 ноября 2013, 15:58


Физик


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

AleksTirex  Offline  Сообщение №508 написано: 18 ноября 2013, 12:19


Архимаг


371

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


При запуске квеста заполняются его алиасы, и если какой-то алиас заполнить не удаётся и на нём нет галочки Optional, то квест запускаться не должен.
Поставь галочки Allow Dead, Allow Disabled, Allow Reserved, и проверь квест, возможно, всё заработает.

anton  Offline  Сообщение №509 написано: 21 ноября 2013, 08:53



362
После релиза мода с "когтями", благодаря отзывам пользователей, у меня появилось два вопроса:

1. А возможно ли сделать так, чтобы надетый предмет невозможно было снять?
(цель: когда ГГ попадает например в тюрьму, инвентарь у него отбирают, а вот когти должны остаться)
(сейчас когти имеют тип - драгоценность, занимают предпоследний слот (который перед "FX01"))

2. Как поймать момент, когда магический эффект закончился (и пропадёт его АртОбьект) ?
Я хотел бы вызвать коготь другой формы, когда полностью скроется предыдущая (а значит закончится маг. эффект её вызвавший).
Я написал в спеле для вызова маг. эффекта проверку с "HasMagicEffect", но она не работает.
(т.е. если проверять на 0 - новый эффект никогда не вызывается, если на 1 - вызывается всегда, даже если проверяемый маг. эффект ещё не закончен)

Мой Блог
Kepper  Offline  Сообщение №510 написано: 21 ноября 2013, 09:11



860
anton,
1)
Function EquipItem(Form akItem, bool abPreventRemoval = True, bool abSilent = false)
Это чтобы игрок не мог их снять.

Отбирают ли квестовые предметы в тюрьме?

2)
Event OnEffectFinish(Actor akTarget, Actor akCaster)

EndEvent

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





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