Вверх Вниз


Модератор форума: Kris†a™  
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Вопросы по скриптам Papyrus
sansuli  Offline Сообщение №1 написано: 31 Августа 2012 в 17:29 | Отредактировано: sansuli - Пятница, 17 Апреля 2015, 21:08


The Red Sun


194
Уроки по скриптованию на языке Papyrus
Прежде чем задать вопрос просмотрите вышеуказанные уроки.
ok

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
modgms_user  Offline Сообщение №2791 написано: 26 Января 2018 в 10:04


Странник


20
[quote=Multigone;1298606]Шанс этого ничтожен, но если эффекты распространенные, несколько могут и сработать таким образом.

Ну, я так думаю.

Вообще, такую конструкцию, как в том скрипте, я много раз где видел, никто с этим особо не парился. Ну да, в лог может кинуть ошибку. И... все.[/quote]
Вроде как прекратились ошибки после того, как повесил на скрипт доп. проперти, установив на эту проперти сам маг. эффект и сделал проверку hasmagiceffect.

[quote=Aksyonov;1299200]Конкретно нужно после сна на любой кровати.[/quote]
А событие OnSleepStop(https://www.creationkit.com/index.php?title=OnSleepStop_-_Form) не подойдет?

AlexeyVN  Offline Сообщение №2792 написано: 31 Января 2018 в 00:28


Начинающий


65
Здравствуйте, подскажите пожалуйста как определить что у жертвы забрали душу в камень?

Multigone  Offline Сообщение №2793 написано: 31 Января 2018 в 15:30



641
AlexeyVN, насколько я знаю, в Actor Values это никак не отражается. Если захват производится ванильным SoulTrap(), то тут можно мало что посоветовать.
Способ есть, но с побочными действиями. А именно: попытаться захватить душу мертвого актера, временно выдав игроку подходящий камень душ. Если душа есть, то захват будет успешен. Поскольку SoulTrap() работает только для игрока, для этого придется поменять в СК пустые камни душ, чтобы они могли складываться с заполненными изначально; из игры убрать сообщения (душа захвачена / нет камней душ). Если такое устраивает...

AlexeyVN  Offline Сообщение №2794 написано: 31 Января 2018 в 15:49


Начинающий


65
Multigone, Мудрёно это как - то
Смысл такой - ГГ воскрешает мертвеца (навсегда) цена -15 здоровья и -10 силы
                      Если воскрешённый умирает и не кто у него не захватывает душу 
                              здоровья и силы возвращаются к ГГ
                      иначе
                              сообщение (часть вашей души захвачена в камень)
                      Всё )))))

Multigone  Offline Сообщение №2795 написано: 31 Января 2018 в 17:07



641
AlexeyVN, SoulTrap() не оставляет на актере никаких (видимых) следов своего выполнения. Но мы знаем, что она возвращает false, если:

1) Душа уже была захвачена (эта функция ранее успешно выполнялась на этом актере).
2) У заклинателя нет подходящего камня душ.

Исключив второй пункт (выдав игроку нужный камень), можно утверждать, что SoulTrap() вернет false, если захват происходил ранее, и true, если еще нет.


Цитата
Мудрёно это как - то
Когда найдешь простой способ, не забудь сообщить, ладно?

AlexeyVN  Offline Сообщение №2796 написано: 31 Января 2018 в 17:19


Начинающий


65
Цитата Multigone ()
Когда найдешь простой способ, не забудь сообщить, ладно?
Хорошо ))))
А если использовать HasMagicEffect может получиться?

Multigone  Offline Сообщение №2797 написано: 31 Января 2018 в 17:46



641
AlexeyVN, давай по косвенным признакам:

- смерть актера
- наличие на нем эффекта захвата душ
- наличие у игрока подходящих камней ПЕРЕД смертью актера.

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

Поэтому моя версия ответа - нет, по косвенным признакам нельзя определить.

AlexeyVN  Offline Сообщение №2798 написано: 31 Января 2018 в 17:59


Начинающий


65
Multigone,Спасибо, жаль конечно( 
мертвяку иммунитет на захват души сделаю

Multigone  Offline Сообщение №2799 написано: 31 Января 2018 в 18:19



641
AlexeyVN, у поднятых зомби изначально иммунитет к этому, согласно условиям в маг. эффектах захвата.

AlexeyVN  Offline Сообщение №2800 написано: 31 Января 2018 в 18:49


Начинающий


65
Multigone, В моём случае я через Resurrect() воскрешаю

modgms_user  Offline Сообщение №2801 написано: 31 Января 2018 в 21:22


Странник


20
Приветствую снова. Есть ли способ определить, просматривает ли игрок какой-либо контейнер(сундук, мешок, труп, вещи спутника). Если подробней о проблеме, то все тот же мод Worlds Dawn с определенными условиями добавляет зачарованные или улучшенные вещи в некоторые контейнеры(или может зачаровать\улучшить имеющиеся).
В моде скрипт один скрипт проверяет контейнеры на валидность, чтобы куда не следует не добавлялось, потом запускает отдельный скрипт для контейнера, который с определенными условиями может производить вышеописанные действия по добавлению\улучшению.
В игре заметил, что обработка может происходить в момент просмотра такого контейнера игроком, вещи просто появляются на глазах, что выглядит нелепо.
Пробовал в скрипт совать считывание объекта перед курсором через GetCurrentCrosshairRef и прерывать процесс, когда объект совпадает с обрабатываемым контейнером, ведь часто перед открытием прицел как раз наведен на контейнер. Но такой вариант не проходит когда игрок уже смотрит содержимое контейнера. Как можно попроще сделать это дело, чтобы и такие нелепости с появлением вещей на глазах предотвратить и сильно скрипт не утяжелить, не замедлить?. Не смог найти нужной функции. Onitemremoved\onitemadded тоже сработают только при удалении, добавлении вещи, да и о них пишут, что они могут тормоза вызвать, если, например, вещей много и использована кнопочка "забрать всё". Может что-то ещё попроще есть, чтобы в скрипте получить objectreference открытого игроком контейнера и сравнить с обрабатываемым скриптом?

Multigone  Offline Сообщение №2802 написано: 31 Января 2018 в 22:33



641
modgms_user, можно перком Activate получить референс "активируемого" игроком объекта, сделать что нужно (проверить, положить предметы, еtс.) и потом активировать его по-настоящему.

AlexeyVN  Offline Сообщение №2803 написано: 02 Февраля 2018 в 13:45 | Отредактировано: AlexeyVN - Пятница, 02 Февраля 2018, 13:48


Начинающий


65
Здравствуйте, помогите разобраться
Поменял цвет глаз через SetEyeTexture()
Можно ли обратно вернуть начальный цвет глаз
пробовал Game.GetPlayer().Reset() - какой то 33 кадр появляется но глаза приобретают начальный цвет

Multigone  Offline Сообщение №2804 написано: 02 Февраля 2018 в 17:47



641
AlexeyVN, QueueNiNodeUpdate() не подходит?

AlexeyVN  Offline Сообщение №2805 написано: 02 Февраля 2018 в 18:00


Начинающий


65
хотелось бы без SKSE обойтись

Добавлено (02 Февраля 2018, 18:00)
---------------------------------------------
Multigone, может есть другие варианты изменить, восстановить цвет глаз?


modgms_user  Offline Сообщение №2806 написано: 05 Февраля 2018 в 15:59 | Отредактировано: modgms_user - Понедельник, 05 Февраля 2018, 16:15


Странник


20
Приветствую. Есть вопрос о целесообразности определенного кода. Есть такой мод NIOHighHeels, в нем есть скрипт со следующим фрагментом:
--------------------
Event OnDeath(Actor akKiller)
If effectActor
Self.RemoveEffect()
EndIf
EndEvent

Event OnUnload()
If effectActor
Self.RemoveEffect()
EndIf
EndEvent

Event OnCellDetach()
If effectActor
Self.RemoveEffect()
EndIf
EndEvent

Event OnDetachedFromCell()
If effectActor
Self.RemoveEffect()
EndIf
EndEvent

Function RemoveEffect()
Self.Dispel()
EndFunction
-------------------------------------
Т.е. при этих событиях установлено снимать эффект. Но в логе вижу периодические сообщения об ошибках:
Error: Unable to call Dispel - no native object bound to the script object, or object is of incorrect type
stack:
[None].NIOVHHScaleEffect.Dispel() - "<native>" Line ?
[None].NIOVHHScaleEffect.RemoveEffect() - "NIOVHHScaleEffect.psc" Line ##
[None].NIOVHHScaleEffect.OnCellDetach() - "NIOVHHScaleEffect.psc" Line ##
-------------------
Есть ли в этом коде вообще смысл? Может эффект прибивается при этих событиях и без надобности его снятия? Эффект поднимает перса, когда на нем высокие сапоги. Может этот кусок кода закомментировать?(точнее, я то закомментировал :) и проверю, но интересно узнать теорию. )

Просто на одной страничке с интерпретацией различных ошибок папируса читал вот такое:
When a magic effect is ready to expire, the Papyrus VM will aggressively destroy the instance of the script. It will generate errors like this if the script had an event pending before this happened.

Aksyonov  Offline Сообщение №2807 написано: 06 Февраля 2018 в 21:25



914
Здравствуйте вопрос такой: есть ли скрипт который удаляет все предметы из инвентаря npc кроме одежды? Armor Cloth... очень бы пригодился.

Мой сайт - Сообщество - YouTube Канал - Группа Вконтакте
modgms_user  Offline Сообщение №2808 написано: 06 Февраля 2018 в 21:36


Странник


20
[quote=Multigone;1301132]можно перком Activate получить референс "активируемого" игроком объекта, сделать что нужно (проверить, положить предметы, еtс.) и потом активировать его по-настоящему[/quote]
Спасибо за совет, только пока, полагаю, не могу воспользоваться, если правильно думаю. Там есть какие-то особенности, где-то специально галочки надо поставить? Создал перк, сделал Entry Point Activate, выбрал активировать немедленно, вставил скрипт, записал в функцию Fragment_0 код и добавил debug.trace, чтобы проверить, работает ли, но строки в логе нет, хотя в сохранении скрипт есть. Пробовал и условия во все три места добавлять(для перка, для активирующего и активируемого), вроде условия для активирующего GetIsID=Player , в условия перка тоже условие добавлял, вообще удалял все условия, но проверочной строчки так и не увидел. Что-то где-то пропустил и дойти никак не может. Код примерно такой:
---------------------------------------
Scriptname PRKF_XTDPerk_OnContainerActi_0458E509 Extends Perk Hidden

import XTDUtil

MiscObject Property WDToken Auto
FormList Property WDContainersBlacklist Auto
Keyword Property AnimalKeyword Auto

Function Fragment_0(ObjectReference akTargetRef, Actor akActor)
If akTargetRef && !(WDContainersBlacklist.HasForm(akTargetRef.GetBaseObject() as Form)) && !akTargetRef.HasKeyword(AnimalKeyword) && !akTargetRef.GetItemCount(WDToken)
akTargetRef.AddItem(WDToken,1)
Endif
debug.trace("PRKF_XTDPerk_OnContainerActi_0458E509 Fragment_0 Executed > akTargetRef="+akTargetRef+", akActor="+akActor)
akTargetRef.Activate(akActor)
EndFunction
---------------------------------------------------
В конце debug.trace, от которого ожидалась информация в логе, но информации нет.

Multigone  Offline Сообщение №2809 написано: 07 Февраля 2018 в 00:40



641
modgms_user, я помню такой порядок:

- указать Run Immediately, Replace Default.
- написать ; в скрипте, сохранить перк.
- очистить текстовое поле, добавить Property, написать текст.
- условия по вкусу.
- подать перк игроку.

Проверь, все ли на месте.

Kepper  Offline Сообщение №2810 написано: 08 Февраля 2018 в 14:48



863
Цитата Aksyonov ()
Здравствуйте вопрос такой: есть ли скрипт который удаляет все предметы из инвентаря npc кроме одежды? Armor Cloth... очень бы пригодился.
Если можно использовать SKSE то
Код
Keyword Property ArmorCloth Auto
Function ReweighIngredientsIn(ObjectReference akContainer, Float afWeight) Global
 Int iFormIndex = akContainer.GetNumItems()
 While iFormIndex > 0
  iFormIndex -= 1
  Form kForm = akContainer.GetNthForm(iFormIndex)
  If !kForm.HasKeyword(ArmorCloth)  
   akContainer.RemoveItem(kForm, akContainer.GetItemCount(kForm))
  EndIf
 EndWhile
EndFunction

Если нет, то тут надо думать.

egermen  Offline Сообщение №2811 написано: 28 Февраля 2018 в 01:55 | Отредактировано: egermen - Среда, 28 Февраля 2018, 01:56


Странник


1
http://modgames.net/load/tes_v_skyrim/doma_i_lokacii/1/254-1-0-13626 друзья помогите найти этот мод....

Wertys  Offline Сообщение №2812 написано: 28 Февраля 2018 в 08:29


Странник


29
Вопрос к скриптерам: существует ли в папирусе аналог консольной команды PCB? PurgeCellBuffers, если точнее, для чистки ячеек. В консоли она вроде как работает, но в функциях не нашел.
Хочется смастерить простецкий модик, а то надоело постоянно консоль юзать.

Aksyonov  Offline Сообщение №2813 написано: 02 Марта 2018 в 07:46 | Отредактировано: Aksyonov - Пятница, 02 Марта 2018, 07:47



914
Здравствуйте уважаемые - вопрос такой: можно ли применить морфинг скриптом? Нужно изменить навсегда физиономию
ГГ что бы он исказился в гримасе ненависти! Это реально организовать? В бою он скалится допустим, как это работает?

Мой сайт - Сообщество - YouTube Канал - Группа Вконтакте
Multigone  Offline Сообщение №2814 написано: 02 Марта 2018 в 11:02



641
Aksyonov, для Actor есть возможность установить выражение лица и сбросить:

Код
Function SetExpressionOverride(int aiMood, int aiStrength = 100) native
; Sets an expression to override any other expression other systems may give this actor.
; 7 - Mood Neutral
; 0 - Dialogue Anger        8 - Mood Anger        15 - Combat Anger
; 1 - Dialogue Fear            9 - Mood Fear        16 - Combat Shout
; 2 - Dialogue Happy        10 - Mood Happy
; 3 - Dialogue Sad            11 - Mood Sad
; 4 - Dialogue Surprise        12 - Mood Surprise
; 5 - Dialogue Puzzled        13 - Mood Puzzled
; 6 - Dialogue Disgusted    14 - Mood Disgusted
; aiStrength is from 0 to 100 (percent)

Function ClearExpressionOverride() native
; Clears any expression override on the actor

Не уверен, будет ли это сохраняться после новых диалогов или боя.

Aksyonov  Offline Сообщение №2815 написано: 02 Марта 2018 в 11:05



914
Цитата Multigone ()
Не уверен, будет ли это сохраняться после новых диалогов или боя.

Спасибо большое именно то что нужно  thanks

Мой сайт - Сообщество - YouTube Канал - Группа Вконтакте
MrJygalag  Offline Сообщение №2816 написано: 11 Марта 2018 в 23:43 | Отредактировано: MrJygalag - Понедельник, 12 Марта 2018, 01:03


Странник


2
Вопрос - как мне "добавить" скрипт в конец сцены? Я пытался посмотреть, на примере сцены из квеста DLC2SoulSteal, но там нет конкретной опции, для того, чтобы добавить существующий скрипт, а есть только непонятное поле с Advanced и вполне ясное Papyrus Fragment. Если я вписываю свой скрипт в Papyrus Fragment, то CK выдаёт ошибку, хотя сам по себе скрипт прекрасно работает и компилируется. Сам скрипт:

Scriptname DSMiraak extends Scene
GlobalVariable Property DSMiraakCount Auto
float Property DSM Auto
Function DoSmth()
DSM = DSMiraakCount.Getvalue()
DSM+=1
DSMiraakCount.SetValue(DSM)
EndFunction

P.s: DSMiraakCount присвоено значение моей глобальной переменной DSMiraakCount, у которой изначальное значение "0" и тип - Short. DSM через Property задано значение "0". По идее, это не важно (так как её значение будет перезаписано другим), но я настроил её, на всякий случай.

По идее, если всё заработает правильно и мне удастся "прикрепить" скрипт к концу сцены, значение DSMiraakCount после каждой проигранной сцены (т.е. после поглощения души Мираком) должно будет увеличиваться на 1. Но как привязать свой рабочий скрипт я не знаю, поэтому и обращаюсь к вам.

Multigone  Offline Сообщение №2817 написано: 12 Марта 2018 в 10:57



641
MrJygalag, попробуй так:

- в поле фрагментов напиши ;
- сохрани квест и зайди снова
- добавь новое Property с твоим именем
- в поле фрагментов напиши:

Код
DSMiraakCount.Mod(1.0)

- сохрани еще раз

EFA2  Offline Сообщение №2818 написано: 28 Марта 2018 в 15:50


Странник


1
Здравствуйте! Подскажите, каким образом можно заставить NPC лежать в том месте где данный объект находится (стоит или идет, например).

Добавлено (28 Марта 2018, 15:50)
---------------------------------------------
Всем спасибо за участие! Разобрался)


Wertys  Offline Сообщение №2819 написано: 28 Марта 2018 в 22:39


Странник


29
Решил я тут кое-что поправить в игре, и появилось 2 проблемки:
- как заставить в эффекте проиграть выбранный звук? Попытался сделать так:

Sound Property Sound Auto

Event OnMagicEffectApply(ObjectReference akCaster, MagicEffect akEffect)
...
Sound.play(GetRef())
...
EndEvent

Скрипт сохраняется без ошибок, свойства выставил, но в игре звук не работает все же.. 

- как проверить что маркер находится в конкретной ячейке? какую функцию лучше использовать для проверки (IsInLocation, GetCurrentLocation, GetLocation...), и как?

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

Multigone  Offline Сообщение №2820 написано: 29 Марта 2018 в 16:16



641
Wertys,

1)

Код
Sound Property Sound Auto

Цитата Wertys ()
Скрипт сохраняется без ошибок, свойства выставил, но в игре звук не работает все же..
Если имя переменной совпадает с названием любого типа переменных, компилятор выдаст ошибку "cannot name a variable or property the same as a known type or script".

Для скрипта ActiveMagicEffect это должно быть что-то вроде:


Код
Sound Property MySound Auto

Event SomeEvent()
    MySound.Play(GetTargetActor())
    ...

2)

Код
ObjectReference Property MyRef Auto
Location Property MyLocation Auto

Event SomeEvent()
    IF MyRef.GetCurrentLocation() == MyLocation
        ...

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