Модератор форума: 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? Пиши не в ЛС, а в эту тему.
anton  Offline  Сообщение №451 написано: 30 октября 2013, 10:50 | Отредактировано: anton - 30 октября 2013, 10:52



362
Цитата AleksTirex

ObjectReference closestObject = Game.FindClosestReferenceOfTypeFromRef(myForm, Game.GetPlayer(), 512.0)


Ничего у меня не получилось. Как я только не добавлял обьект в поиск, всё равно ничего не находится. Ни арт обьект, ни обьект самой одежды, ни через прямое указание на форму, ни через форм лист.
В общем всё равно мне кажется в "Art Object" анимацию таким способом не изменить. У меня функция "PlayGamebryoAnimation()" работала только на "активаторах" или чём то относящемуся к типу "Object Reference". Так что пока заброшу эту идею, трёх анимаций управляемых ванильным BHV файлом и так будет достаточно...

У меня тут вопрос попроще образовался: Как можно заставить Актёра скриптом "ойкнуть" в заданное время, как будто его щипнули/ударили ?
(звука типа "Ай" среди звуковых эффектов нету, может можно его как то виртуально ударить, чтобы воспроизвёлся стандартный звук НСП для такой ситуации...)

Мой Блог
LordVadim  Offline  Сообщение №452 написано: 30 октября 2013, 13:44



139
sansuli, Добавь в ссылки: Декомпилятор .Pex в .Psc - отлично декомпилирует скрипты .Pex, сохраняет формат Papyrus. Для изучения чужих скриптов без исходников - просто незаменим.

AleksTirex  Offline  Сообщение №453 написано: 30 октября 2013, 13:52


Архимаг


371

Код
То есть, невозможно активировать манекен (не реагирует на курсор). Как это исправить?


Есть два варианта:
1. Дать имя своему манекену и его можно будет активировать. Но "вслепую", надписи не будет. Это не лучший вариант.
2. Сделать свой активатор вместо MannequinActivateTrig (например, aaaMannequinActivateTrig) и в скрипте назначить его вместо дефолтного. На него добавить скрипт и добавить файл модели. Тогда всё будет правильно работать.
 
Скрипт:
 
Scriptname aaaMannequinActivateTrigScript extends ObjectReference 
 
Actor Property Manaken Auto Hidden
 
Event OnActivate(ObjectReference akActionRef)
  if akActionRef == Game.GetPlayer()
    Manaken.Activate(self)
  endif
EndEvent

 
Файл модели: http://yadi.sk/d/PSsM39LzBqxER или сделать свой на подобии этого.
 
------------
 
В свой скрипт манекена внести изменения (уже после создания своего активатора со скриптом):
 
Activator Property aaaMannequinActivateTrig Auto
Static Property XMarkerHeading Auto
ObjectReference st_MarkerHeading
ObjectReference at_ActivateTrig

 
Function f_CreateMarkers()
     if at_ActivateTrig == None
          at_ActivateTrig = Self.PlaceAtMe(MannequinActivateTrig)
     EndIf
     if st_MarkerHeading == None
          st_MarkerHeading = Self.PlaceAtMe(XMarkerHeading)
     EndIf
endFunction

 
EVENT OnCellLoad()
     wait(0.25)
     f_CreateMarkers()
     (at_ActivateTrig as aaaMannequinActivateTrigScript).Manaken = self

    ...
    ...
EndEVENT


-----------------
В событии OnCellLoad() последовательность команд должна быть именно такой.

 
Код
ни обьект самой одежды


Так всё-таки одежда... lol Что и предполагалось. Тогда забудь про референсы.
 
Бить актёра - это не педагогично, да и неправильно. Нет гарантии, что вообще он "Айкнит", или именно "Ай", а не пошлёт подальше, подобные реплики рендомные из разных фраз.
Для этих целей есть команда Say(), но... делать свой топик придётся, если не найдёшь дефолтного такого топика.

anton  Offline  Сообщение №454 написано: 30 октября 2013, 15:16



362
Цитата AleksTirex

Для этих целей есть команда Say()

Да эта команда хоть что то бы произнесла. Выбирал на угад несколько ванильных топиков, но ГГ молчит как рыба. Наверное сделаю проще, через "саунд маркер". Запишу свою Wav-ку и буду её запускать...

Мой Блог
AleksTirex  Offline  Сообщение №455 написано: 30 октября 2013, 15:36


Архимаг


371

Код
Просто хотелось ещё менять анимацию лезвий, когда ГГ переходит в "боевой" режим ... но раз нельзя, то нельзя.


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

Код
Да эта команда хоть что то бы произнесла. Выбирал на угад несколько ванильных топиков, но ГГ молчит как рыба.


А про тип голоса в топиках забыл? И про остальные условия в топиках тоже забыл, да и вообще тот квест мог быть не запущен. ;)

LordVadim  Offline  Сообщение №456 написано: 30 октября 2013, 16:20 | Отредактировано: LordVadim - 30 октября 2013, 19:21



139
Цитата AleksTirex

1. Дать имя своему манекену и его можно будет активировать. Но "вслепую", надписи не будет. Это не лучший вариант.

Первый вариант не подойдет, так как манекен начинает вести себя как NPC - разговаривать, менять анимацию, позы... меня это не устраивает.
А второй вариант попробую.

Алекс, СПАСИБО!!!
Второй вариант сработал, только не получается переместить манекен. Выполняю:

st_MarkerHeading.MoveTo(Game.GetPlayer())
at_ActivateTrig.MoveTo(Game.GetPlayer())
MoveTo(st_MarkerHeading)


Манекен и активатор перемещаются в новую позицию, затем активатор остается в новой позиции, а манекен возвращается в точку, где был создан. Как это поправить?
И еще вопрос: как получить координаты точки куда указывает курсор?

AleksTirex  Offline  Сообщение №457 написано: 30 октября 2013, 19:38 | Отредактировано: AleksTirex - 30 октября 2013, 19:50


Архимаг


371


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


А ты в скрипте манекена заменил все команды MoveTo(GetLinkedRef()) на
MoveTo(st_MarkerHeading) ?
 
******************

С курсором не знаю, ни разу не задавался таким вопросом. Если придумаю как - скажу.

LordVadim  Offline  Сообщение №458 написано: 30 октября 2013, 20:00 | Отредактировано: LordVadim - 30 октября 2013, 20:07



139
Цитата AleksTirex

А ты в скрипте манекена заменил все команды MoveTo(GetLinkedRef()) на MoveTo(st_MarkerHeading) ?

Заменил.
Такое впечатление, что при создании манекена он привязывается еще к какому то маркеру.
По курсору уточню: меня интересует положение курсора при выполнении заклинания, то есть в какой точке создавать манекен.

anton  Offline  Сообщение №459 написано: 30 октября 2013, 20:36



362
Цитата AleksTirex

И во время боя и нет, маг.эффекты сами будут меняться,


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

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

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

Мой Блог
AleksTirex  Offline  Сообщение №460 написано: 30 октября 2013, 21:11


Архимаг


371

Код
Получается "маг-эффекты" срабатывают только если я одеваю предмет (который собственно и запускает "спелл" на выполнение) и при этом заданное условие [u]уже выполняется. Например если я сидя надену предмет, то когти появятся. И не пропадут до тех пор, пока я предмет не сниму, вне зависимости встану я потом или нет.


Не, ты меня не понял, надо выставить условия в самих эффектах, а не в скрипте. Если на эффект повесить условие IsInCombat == 1, то сам спелл при надевании предмета запустится, но маг.эффект не будет действовать вне боя. Движок всё это время думает, что спелл и эффект действуют, а в реале ничего не действует, если условия на эффекте не выполняются.
У тебя условие выполняется для запуска спелла, но не для отработки эффекта.
 
А вот теперь повесь на свой эффект условие Subject GetSitting > 0, и сам увидишь, что когти уберутся сразу, как ты встанешь. При этом, они сразу вновь появятся, когда ты опять сядешь.

Добавлено (31 Октября 2013, 01:11)
---------------------------------------------
LordVadim, тогда весь скрипт показывай.


anton  Offline  Сообщение №461 написано: 30 октября 2013, 21:52



362
Цитата AleksTirex

А вот теперь повесь на свой эффект условие

Так я так и делал... именно на "маг-эффект" внутри окошка свойств каждого "маг-эффекта" ...  и эффект включается только при изначальном совпадении условия и один раз и на всегда.

Может надо на "маг-эффект", но внутри окошка свойств "спела", запускающего их... завтра проверю.

Мой Блог
Artem13  Offline  Сообщение №462 написано: 31 октября 2013, 07:57


Mercenaries. Со смертью на ты.


Цитата anton

Может надо на "маг-эффект", но внутри окошка свойств "спела", запускающего их


Именно.

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
anton  Offline  Сообщение №463 написано: 31 октября 2013, 08:59



362
Artem13AleksTirex,  ДАааааа !!!!!   good    ТАК    работает !!!!!      ok

Абалдеть просто !   сколько новых возможностей открывается !!!   ^_^

( так всё, у меня начинается очередной приступ счастья, ближайшие пару часов меня не беспокоить !  :D )

Мой Блог
AleksTirex  Offline  Сообщение №464 написано: 31 октября 2013, 13:52


Архимаг


371
anton, если "на пальцах" объяснить, то условия на самом маг.эффекте являются как бы определение параметров цели, на которую будет применён этот эффект, т.е. срабатывать ему или нет.
Условия в спелле на маг.эффекте - это как бы "общие" и условия самого заклинателя, т.е. применять ли этот эффект вообще. От этих условий зависит "наложить эффект или снять, если он наложен", а вот условия на самом эффекте - это сработает ли он на целе или нет (а если сработал, то и дальше будет работать).

***********************
 

Код
По курсору уточню: меня интересует положение курсора при выполнении заклинания, то есть в какой точке создавать манекен.


Так ты хочешь создавать манекена через заклинание?
Тогда это ещё проще:
 
1. Делаешь свой спелл и маг.эффект призыва своего актёра (например маленького невидимого краба, или питомца).
2. Дальность призыва по желанию. Время призыва 1 секунда.
3. Делаешь свою способность со скриптом и даёшь её этому актёру.
Скрипт:
 
ActorBase Property akManakenBase  Auto
Static  Property XMarkerHeading  Auto

 
Event OnEffectStart(Actor Target, Actor Caster)
  ObjectReference akMarker = Target.PlaceAtMe(XMarkerHeading)
  Target.Disable()
  Utility.Wait(0.25)
  float fAngle = akMarker.GetAngleZ() + akMarker.GetHeadingAngle(Game.GetPlayer())
  akMarker.SetAngle(0.0, 0.0, fAngle)
  Actor akNewManaken = akMarker.PlaceActorAtMe(akManakenBase)
  akMarker.DisableNoWait()
  akMarker.Delete()
  (akNewManaken as MannequinActivatorSCRIPT).OnCellLoad()
EndEvent

 

akManakenBase - базовый манекен
MannequinActivatorSCRIPT - скрипт, который на этом базовом манекене (у тебя он свой)
 
Такое количество команд надо для точного позиционирования манекена в точке курсора. (команды и их последовательность не меняй)

Ничего в скрипте манекена изменять не надо. Все необходимые маркеры создадутся сами в скрипте манекена.

*********
Вот только подумай над вариантом "отмены/удаления" манекенов, ведь игрок может их нафигачить, что пройти будет нельзя.

anton  Offline  Сообщение №465 написано: 31 октября 2013, 14:17



362
А у меня ещё вопросы возникли:
- по событию isInCombat или GetCombatState когти вылазят только если ударить кого то, а хотелось бы чтобы вылазили при принятии ГГ боевой стойки. Какую ещё переменную можно попробовать ?
- как проверить, что перк, назначенный скриптом, работает ? Я назначаю FistsOfSteel и DeftMovement, но они нигде не отображаются... По идее должен увеличится урон при рукопашном бое, но если с мечом игра урон показывает, то без оружия пишет просто "0" и всё. В списке активных способностей ГГ тоже пусто.

Мой Блог
AleksTirex  Offline  Сообщение №466 написано: 31 октября 2013, 14:21 | Отредактировано: AleksTirex - 31 октября 2013, 14:26


Архимаг


371
anton, IsWeaponOut, GetIsAlerted

****
Сходи и отлупи кого нибудь в обоих режимах, и увидишь разницу. (хотя, если перки дефолтные, то разница будет не большой)

LordVadim  Offline  Сообщение №467 написано: 31 октября 2013, 15:14



139
Цитата AleksTirex

Вот только подумай над вариантом "отмены/удаления" манекенов, ведь игрок может их нафигачить, что пройти будет нельзя.


Управление манекеном через активацию в снек-режиме (в том числе и удаление).
Скрипт попробую отпишусь.
Спасибо!

anton  Offline  Сообщение №468 написано: 31 октября 2013, 15:58 | Отредактировано: anton - 31 октября 2013, 16:04



362
Цитата LordVadim

Сходи и отлупи кого нибудь

Так и сделал, разница вроде есть. Перки усилил, так что теперь и стражника в рукопашку можно попробовать налупить ! :)

Можете меня поздравить ! Теперь мод полностью готов, и именно так как мне и хотелось !
Реализована и интерактивная анимация предмета одежды, и добавлена анимация для ГГ при надевании, и озвучены
события, связанные с предметом (в том числе и "Ай" для ГГ), спецэффекты присутствуют, перки - на месте. Ляпота !...
Осталось только играть и получать удовольствие  ^_^ !

AleksTirex, тебе, как всегда, огромное спасибо за помощь и вагон печенек впридачу ! :) что бы я без тебя делал !

Мой Блог
AleksTirex  Offline  Сообщение №469 написано: 31 октября 2013, 16:37


Архимаг


371

Код
Можете меня поздравить ! Теперь мод полностью готов, и именно так как мне и хотелось !


Поздравляю! good

*******************
Всегда пожалуйста. :)

valambar  Offline  Сообщение №470 написано: 31 октября 2013, 19:31 | Отредактировано: valambar - 31 октября 2013, 19:43



513
Нужен скрипт, делающий вот что:
1. В общем и целом фасттревел отключен намертво.
2. При активации активатора, на который навешен скрипт, открывается карта и фасттревел становится возможным, но только для нескольких указанных локаций (а точнее, маркеров карты), в остальные попасть по прежнему невозможно.
2а. Фасттревел в указанные локации будет возможен даже в том случае, если они не посещены - то есть самая первая активация данного активатора не только делает их видимыми на карте, но и доступными для фасттревела.
2б. Открытие карты обычным способом не позволяет фасттревел, в том чисел и в данные локации.
3. Путешествовать таким образом можно только один раз в сутки - при повторной активации будет мессажбокс типа "Энергия телепорта израсходована, подождите до завтра".

LordVadim  Offline  Сообщение №471 написано: 1 ноября 2013, 19:42 | Отредактировано: LordVadim - 1 ноября 2013, 19:43



139
Цитата AleksTirex

ObjectReference akMarker = Target.PlaceAtMe(XMarkerHeading)

Не срабатывает. Target = Player() и манекен создается не в точке курсора, а рядом с игроком. ( Magic Effect - на цель )
Координаты точки создания заклинания надо получить как то по другому.

AleksTirex  Offline  Сообщение №472 написано: 1 ноября 2013, 20:52


Архимаг


371
Нет друзья, так не пойдёт, писать такие слишком уж подробные инструкции "вдруг" как-то расхотелось - вы не читаете, что вам пишут! Так зачем я тогда всё это пишу?


Код
(команды и их последовательность не меняй)

 
Читал? И где ты видел там Target = Player() ?

Способность у призванного актёра, вот и манекен создаётся у этого призванного актёра (который сразу же удаляется). Откуда взялся там ГГ? Если сам что-то меняешь или добавляешь, то как минимум, надо об этом писать, телепатией тут никто не обладает.
 
Если сделать всё от и до, как там написано, то всё будет прекрасно работать.

LordVadim  Offline  Сообщение №473 написано: 2 ноября 2013, 04:34 | Отредактировано: LordVadim - 2 ноября 2013, 05:50



139
Цитата AleksTirex

Читал? И где ты видел там Target = Player() ?


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

Event OnEffectStart(Actor Target, Actor Caster)

Target = Player() я имел ввиду, что при входе в скрипт переменная  Target имеет значение равное ID игрока.
То есть в нее, почему то, записана ссылка на игрока, а не на создаваемое существо.
Caster тоже имеет значение равное ID игрока.

DarkVetal  Сообщение №474 написано: 2 ноября 2013, 06:39

Народ, помогите плиз !
Нужен маркер/триггер со скриптом, проходя через который все живые существа мгновенно умирают, вне зависимости от того, насколько они прокачены и сколько у них жизней, даже если это двемерские роботы.

AleksTirex  Offline  Сообщение №475 написано: 2 ноября 2013, 10:35


Архимаг


371

Код
То есть в нее, почему то, записана ссылка на игрока, а не на создаваемое существо.



Код
1. Делаешь свой спелл и [b]маг.эффект призыва своего [u]актёра (например маленького невидимого краба, или питомца).  
2. Дальность призыва по желанию. Время призыва 1 секунда.  
3. Делаешь свою [b]способность [u]со скриптом и даёшь её [u]этому актёру.


И даёшь её этому призываемому актёру. Способность висит на актёре, а не на ГГ. Скрипт на способности, а не на заклинании призыва.
Два спелла - призыв актёра и способность на актёре, на способности скрипт.

 

Код
триггер со скриптом, проходя через который все живые существа мгновенно умирают,


Event OnTriggerEnter(ObjectReference akActionRef)
 if akActionRef != Game.GetPlayer()
   (akActionRef as Actor).Kill()
 endif
EndEvent

 
Если надо и ГГ убивать, то тогда условия можно убрать.

LordVadim  Offline  Сообщение №476 написано: 2 ноября 2013, 11:08



139
Цитата AleksTirex

И даёшь её этому призываемому актёру. Способность висит на актёре, а не на ГГ. Скрипт на способности, а не на заклинании призыва. Два спелла - призыв актёра и способность на актёре, на способности скрипт.


Алекс, Спасибо! Буду разбираться.

С перемещением манекена разобрался. в AI пакете присоединенном к манекену в скрипте была прописана функция MoveToMyEditorLocation(), поэтому манекен у меня и возвращался в точку создания после любого перемещения.

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



5
Как скомандовать в скрипте, чтобы у ГГ пропали все вещи и золото, кроме квестовых?

Вроде Game.getPlayer().RemoveAllItems() нашёл в одном моде NoDeadMode, но там исчезают все предметы (камень барензии к примеру) и игра виснет тупо.

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

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

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


Архимаг


371
Цитата DarkVetal

И какой триггер для этого взять?



В разделе "Активаторы" создаёшь свой активатор. В нём в окне Scripts жмёшь Add и делаешь новый скрипт, в нём пишешь тот код и Ctrl+S (что выше написан). ОК.
Тыркаешь на место установки триггера, потом нажимаешь Create Trigger (кубик с буквой Т), в выскочившем окне выбираешь свой созданный активатор. ОК.
У тебя по размеру ??? создастся бокс. Стрелочками растягиваешь свой триггер-бокс на нужные размеры (для выключения этого режима "2" или "W" на клавиатуре).

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



5

ObjectReference Property akContainer Auto ; назначается свой сундук в любой локации
 
Game.GetPlayer().RemoveAllItems(akContainer) ; переместить все вещи ГГ в сундук
akContainer.RemoveAllItems(Game.GetPlayer()) ; переместить все вещи из сундука к ГГ

Вставил сей фрагмент и всёравно зависает.
По плану скрипта, при смерти ГГ у него исчезает всё золото и все шмотки. Пока не брал камень барензии скрипт работал на ура. Т.е. ресался в храме вайтрана голым и нищим. Теперь если ремове.все_шмотки, то ресаюсь в храме голым и висю... ничего не откликается.

Не подскажешь, как только одну шмотку выкинуть к примеру, или выкинуть всё кроме одной шмотки (камня барензии например)?

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





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