• Страница 106 из 106
  • «
  • 1
  • 2
  • 104
  • 105
  • 106
Модератор форума: 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? Пиши не в ЛС, а в эту тему.
Stea1ch  Offline  Сообщение №3151 написано: 3 мая 2023, 07:19



187
Мда... либо топик мертв - либо не осталось знатоков...

Накатал такой скрипт, призванный парализовать нежить, прикрутил к эффекту, работает, только вот нежить что на ногах почему-то не падает, а продолжает "бег на месте". Паралич срабатывает, но не так. Может какой еще эффект надо прикрутить чтобы нежить с ног валилась и лежала? Кто знает какой эффект прикрутить или какой создать и прикрутить?

Scriptname ForgottenSpellsParalyze extends ActiveMagicEffect  
Explosion Property PowerSerpentStoneExplosion  Auto  
Keyword Property UndeadKeyword  Auto
Spell Property MS08ParalysisAbility  Auto 
Event OnEffectStart(Actor Target, Actor Caster)
;if target is undead - add extra explosion and paralyze effect
 if Target.HasKeyword(UndeadKeyword)
 Target.PlaceAtMe(PowerSerpentStoneExplosion, 1, False, False)
 Target.AddSpell(MS08ParalysisAbility)
 endif
EndEvent



Человек человеку - волк, а зомби зомби - зомби.
Stea1ch  Offline  Сообщение №3152 написано: 3 мая 2023, 08:47



187
Методом научного тыка я понял, что Target.AddSpell(MS08ParalysisAbility) не выполняется. Переделал способность и эффект, отвязав от квеста MS08 (создал свои на основе ванильных), прописал все в скрипт - с нулевым результатом. Хотя из консоли если я кликаю по драугру или скелету и командой addspell добавляю мой созданный паралич - цель успешно падает лапками кверху. За основу взят скрипт огненного плаща Дж'зарго. ЧЯДНТ?


Человек человеку - волк, а зомби зомби - зомби.
Stea1ch  Offline  Сообщение №3153 написано: 3 мая 2023, 19:20



187
Всем огромное спасибо, вы все мне так хорошо помогли своим молчанием и игнором, что я сделал все сам. Хрена с два я теперь поделюсь как. Всех благ.


Человек человеку - волк, а зомби зомби - зомби.
Вальтэр  Offline  Сообщение №3154 написано: 20 мая 2024, 21:41



49
Народ, часом никто не делал скрипт на дверь? Как бы она должна открываться и закрываться к примеру утром и вечером, без рычага и триггера, только по времени. Нужно для ставней в домах.

Вальтэр
Вальтэр  Offline  Сообщение №3155 написано: 25 мая 2024, 10:23



49
Хельп други подскадите, что не так. Двери должны открываться, но они стоят. Это скрипт для ставней.

scriptName ............ extends ObjectReference

{Controls a set of Lock with a master enable parent marker with this

script attached to turn on and off at the times of the day specified

by the properties CloseTime and OpenTime}

float Property CloseTime = 7.0 auto

{The time at which Lock should be turned off}

float Property OpenTime = 18.0 auto

{The time at which Open should be turned on}

float Function GetCurrentHourOfDay() global

{Returns the current time of day in hours since midnight}

float Time = Utility.GetCurrentGameTime()

Time -= Math.Floor(Time) ; Remove "previous in-game days passed" bit

Time *= 24 ; Convert from fraction of a day to number of hours

Return Time

EndFunction

Function RegisterForSingleUpdateGameTimeAt(float GameTime)

{Registers for a single UpdateGameTime event at the next occurrence

of the specified GameTime (in hours since midnight)}

float CurrentTime = GetCurrentHourOfDay()

If (GameTime < CurrentTime)

GameTime += 24

EndIf

RegisterForSingleUpdateGameTime(GameTime - CurrentTime)

EndFunction

Event OnInit()

If (ShouldClose())

GoToState("Close")

Else

GoToState("Open")

EndIf

EndEvent

State UnLock

Event OnBeginState()

Disable()

RegisterForSingleUpdateGameTimeAt(OpenTime)

EndEvent

Event OnUpdateGameTime()

If (ShouldClose())

RegisterForSingleUpdateGameTimeAt(OpenTime)

Else

GoToState("Open")

EndIf

EndEvent

EndState

State LockOn

Event OnBeginState()

Enable()

RegisterForSingleUpdateGameTimeAt(CloseTime)

EndEvent

Event OnUpdateGameTime()

If (ShouldClose())

GoToState("Close")

Else

RegisterForSingleUpdateGameTimeAt(CloseTime)

EndIf

EndEvent

EndState

bool Function ShouldClose()

{Validate the Open state based on current time of day}

float CurrentTime = GetCurrentHourOfDay()

If (CurrentTime >= CloseTime) && (CurrentTime < OpenTime)

return true

Else

return false

EndIf

EndFunction


Вальтэр
Multigone  Offline  Сообщение №3156 написано: 25 мая 2024, 12:58



825
Вальтэр

1) изменить названия состояний UnLock на Close и LockOn на Open;
2) в функции RegisterForSingleUpdateGameTimeAt регистрация должна происходить с немного увеличенным временем, т.е. не (GameTime - CurrentTime), а (GameTime - CurrentTime + 0.01);

Вальтэр  Offline  Сообщение №3157 написано: 25 мая 2024, 15:22



49
Multigone,  спасибо попробую

Вальтэр
Вальтэр  Offline  Сообщение №3158 написано: 29 мая 2024, 09:04



49
Multigone, Спасибо получилось, но пришлось не только изменить эти строки, а ещё и добавить строки на анимацию.

Вальтэр
Stea1ch  Offline  Сообщение №3159 написано: 22 июня 2024, 22:24 | Отредактировано: Stea1ch - 22 июня 2024, 22:25



187
Нетривиальный вопрос: Имеется мод, где у некоторых NPC раскрашенные лица. Имеется в виду мод на детей TKAA. Как и чем был создан этот мод - не ясно, в описание четко указано что нельзя использовать CreationKit - все порушится к чертям. Хочу сделать команду "Иди умойся!" чтобы ребенок пошел к ближайшему умывальнику (это как раз не сложно) и умылся, соответственно нужен результат - лицо без краски. Посмотреть на непися в CreationKit не могу - они все восклицательные знаки. Так же в CK видимо не все отображается, вижу текстуры татуировок и раскраски в Tint, но у них у всех полная прозрачность стоит, не должны отображаться, но в игре еще как видны... собственно сабж: как отключить определенную текстуру скриптом? Ну или как реализовать затею? Есть идеи? 


Человек человеку - волк, а зомби зомби - зомби.
Multigone  Offline  Сообщение №3160 написано: 24 июня 2024, 06:52 | Отредактировано: Multigone - 24 июня 2024, 07:00



825
Stea1ch, моды в СК обычно создаются, возможно, с последующими изменениями в TESVEdit. Если скрипты в .bsa, то при пересохранении .esp в СК может произойти потеря связей между ними (? уточнить). Восклицательные знаки случаются, когда СК не может получить данные моделей (они отсутствуют по указанным в формах путям). Слайдеры настройки внешности актера могут не использоваться игрой, а служить для экспорта меша и оттенка головы в папки FaceGen (Ctr+F4 на форме актера). Меш может быть отредактирован далее, ему назначены опред. текстуры и прочее.

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

Stea1ch  Offline  Сообщение №3161 написано: 25 июня 2024, 14:32 | Отредактировано: Stea1ch - 25 июня 2024, 14:35



187
Цитата Multigone

Проще всего раскурочить какой-нибудь мод, где в заявленных возможностях есть изменение татуировок на актерах


Да вот не проще. Такой мод всего один - EFF, зависит от мода RaceMenu и UIExtensions, и он не работает на SE, точнее именно функция изменения внешность непися, она заточена под самую свежую SKSE для AE. Был когда-то мод NPC Appearance Changer - но автор его грохнул с нексуса окончательно и бесповоротно. Да и мне кажется что он тоже костыльный, с проекцией внешности гг на непися и только. Да и вообще этот мод глючный до безумия. Автор однозначно хотел как лучше, но порушил скрипты, отвечающие за поведение напарника, напарник не переходит на другие локации за ГГ, без консоли вообще никак не поиграешь. Пока реализовал только костыль: Ctr+F4 на форме актера, затем удаление экспортированного меша (иначе конская голова) - в этом случае игнорируются татуировки и боевая раскраска, экспортируется только SkitTone от расы, вся боевая раскраска благополучно исчезает. Но надо это реализовать скриптом. Учитывая что мод все же есть - значит можно. Надо как-то достучаться до прозрачности текстур, их имена можно поглядеть, но как скриптом сдвинуть ползунок прозрачности на ноль - хз.


Человек человеку - волк, а зомби зомби - зомби.
Multigone  Offline  Сообщение №3162 написано: 26 июня 2024, 11:12



825
Скриптами можно управлять HeadPart (Actor, ActorBase), TextureSet (ActorBase, только для игрока (?)), Skin (ActorBase, Race), ColorForm (цвет пресетов доп. слоев текстур актера, используемых в Race).
Если я правильно понял, моделью головы из папки FaceGenData используется одна текстура для всех отметок (татуировки, макияж, грязь и т.д.). Думаю, здесь ничего нельзя сделать, т.е. чтобы произвольному актеру без подготовки заменить одну из его отметок.
С подготовкой актера и соотв. форм: можно заменить ему Skin, или HeadPart (голову).

Stea1ch  Offline  Сообщение №3163 написано: 26 июня 2024, 12:40 | Отредактировано: Stea1ch - 26 июня 2024, 12:40



187
Цитата Multigone

Если я правильно понял, моделью головы из папки FaceGenData используется одна текстура


При экспорте из этого мода экспортируется только одна текстура, а в самой форме текстуры раскраски и татуировок присутствуют отдельными файлами. Именно с этим модом такая беда, ванильные модельки с раскрашенными лицами нормально редактируются, у них ползунки прозрачности имеют положительное значение. В этом моде модели не видны в СК и прозрачность везде стоит на 0, однако по факту это не так. В xEdit оно тоже не видно, видна только основная текстура. Но они же есть! А вот управление TextureSet - это интересно! Если удастся просто скриптом подменить TextureSet на аналогичный с расы - то это решение! Благо что в этом моде раскрашенные лица только у детей из враждебных фракций, но каждая раса представлена как минимум двумя неписями - враждебными и обычными. Так что замена TextureSet на аналогичный из той же расы однозначно проканает. Можно хоть пример какой, куда копать? Не видел я таких скриптов.


Человек человеку - волк, а зомби зомби - зомби.
Multigone  Offline  Сообщение №3164 написано: 26 июня 2024, 16:45 | Отредактировано: Multigone - 26 июня 2024, 17:04



825
Я имею в виду, что все ванильные актеры имеют данные о внешности в виде модели головы, находящейся в Meshes...FaceGenData, и одной (?) текстуры оттенка кожи / татуировок / макияжа / грязи, находящейся в Textures...FaceGenData. Эта текстура получается путем смешивания желаемых слоев при создании / экспорте данных актера.
Путь к текстуре указан внутри модели, поэтому, чтобы изменить текстуру, функция скрипта должна уметь оперировать с самой моделью. Насколько я знаю, таких функций в LE нет.
Игра позволяет назначать другие наборы текстур (TextureSet) для форм, имеющих World Model, но неясно, можно ли это сделать для актеров или их HeadParts (не в курсе, нужны тесты).
За это отвечают функции GetWorldModelNumTextureSets, GetWorldModelNthTextureSet, SetWorldModelNthTextureSet. Для ActorBase есть функция Get/SetFaceTextureSet, но неясно, можно ли использовать ее для кого-либо, кроме игрока.

Типичные ситуации применения:
Form Property xF Auto ; какая-то форма, например, актер (?), Armor (skin) или HeadPart
TextureSet Property xS Auto
Function MyFun()
    Int iN = xF.GetWorldModelNumTextureSets() ; число элементов у модели, которые могут иметь TextureSet (?)
    If iN >= 3 and xF.GetWorldModelNthTextureSet(2) != none ; порядок номеров элементов начинается с 0; например, проверяем, что число элементов не меньше 3, и что значение третьего элемента не пусто
        xF.SetWorldModelNthTextureSet(xS, 2) ; даем третьему элементу модели новое значение xS
        If xF as Actor and (xF as Actor).IsOnMount() == false ; например, проверяем, является ли форма актером, и не находится ли он верхом
            (xF as Actor).QueueNiNodeUpdate() ; обновляем модель ; DO NOT USE WHILE MOUNTED

Actor Property xA Auto
Function MyFun()
    ((Game.GetPlayer().GetBaseObject()) as ActorBase).SetFaceTextureSet(xS)
    ((xA.GetBaseObject()) as ActorBase).SetFaceTextureSet(xS)
    ; обновляем модели, убедившись, что актеры не верхом, в противном случае ждем, пока они спешатся, либо спешиваем их принудительно

Далее, сохранение не запоминает эти изменения, поэтому их нужно производить при каждой загрузке актера (?).

Stea1ch  Offline  Сообщение №3165 написано: 29 июня 2024, 21:58 | Отредактировано: Stea1ch - 29 июня 2024, 21:59



187
Цитата Multigone

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


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


Человек человеку - волк, а зомби зомби - зомби.
Stea1ch  Offline  Сообщение №3166 написано: 29 июня 2024, 22:06 | Отредактировано: Multigone - 30 июня 2024, 15:08



187
Другой вопрос по другому моему моду: хочу использовать ритуальное заклинание иллюзии (зрение десятого глаза) для включения/отключения объектов. Но ванильные скрипты жестко привязаны к квесту. Можно ли переколбасить ванильный скрипт для отображения скрытых предметов без прослойки в виде квеста? Пока уткнулся в обязательную переменную, коей в ванильном скрипте является скрипт квеста. Вот ванильный скрипт:

Scriptname MGRitual02EffectScript extends ActiveMagicEffect
{Scripted effect for the Spell Associated with MGRitual02}

Quest Property RitualQuest Auto
ReferenceAlias Property Book01 Auto
ReferenceAlias Property Book02 Auto
ReferenceAlias Property Book03 Auto
ReferenceAlias Property Book04 Auto

float property fDelay auto
{time to wait before switching to constant Imod}
ImageSpaceModifier property IntroFX auto
{IsMod applied at the start of the spell effect}
ImageSpaceModifier property MainFX auto
{main isMod for spell}
ImageSpaceModifier property OutroFX auto
{IsMod applied at the end of the spell effect}
sound property IntroSoundFX auto ; create a sound property we'll point to in the editor
sound property OutroSoundFX auto ; create a sound property we'll point to in the editor
; Obtain the target of the active fire effect

Event OnEffectStart(Actor Target, Actor Caster)
  fDelay = 0.83
  int instanceID = IntroSoundFX.play((target as objectReference)) ; play IntroSoundFX sound from my self
  introFX.apply() ; apply isMod at full strength
  utility.wait(fDelay) ; NOTE - neccessary?
  introFX.remove() ; remove initial FX
  mainFX.apply()
  fDelay=0
  MGRitual02QuestScript QuestScript = RitualQuest as MGRitual02QuestScript
  QuestScript.SpellActive =1
  Book01.GetReference().Enable(True)
  Book02.GetReference().Enable(True)
  Book03.GetReference().Enable(True)
  Book04.GetReference().Enable(True)
EndEvent

Event OnEffectFinish(Actor Target, Actor Caster)
  MGRitual02QuestScript QuestScript = RitualQuest as MGRitual02QuestScript
  QuestScript.SpellActive =0
  Book01.GetReference().Disable()
  Book02.GetReference().Disable()
  Book03.GetReference().Disable()
  Book04.GetReference().Disable()
  int instanceID = OutroSoundFX.play((target as objectReference)) ; play OutroSoundFX sound from my self
  introFX.remove()
  mainFX.remove()
  OutroFX.apply()
endEvent






Человек человеку - волк, а зомби зомби - зомби.
Multigone  Offline  Сообщение №3167 написано: 30 июня 2024, 15:28 | Отредактировано: Multigone - 30 июня 2024, 15:52



825
Stea1ch, объекты для вкл. и откл. определяются референс-алиасами - что в них хранится, тем скрипт и оперирует. Вместо алиасов, можно указать, к примеру, конкретные референсы. Также можно находить референсы вокруг игрока по определенным признакам, но это довольно ресурсоемкая функция.

ObjectReference Property MyObject Auto
Event...
 MyObject.Enable()

...
FormList Property MyFLBaseObjects Auto
Event...
 ObjectReference tempref = Game.FindRandomReferenceOfAnyTypeInListFromRef(MyFLBaseObjects, Game.GetPlayer(), 600.0)
 ; найти случайный подходящий референс из форм-листа с базовыми формами рядом с игроком в радиусе 600 юнитов
 If tempref
   tempref.Enable()
 EndIf

Stea1ch  Offline  Сообщение №3168 написано: 2 июля 2024, 23:11 | Отредактировано: Stea1ch - 2 июля 2024, 23:16



187
Цитата Multigone

Для ActorBase есть функция Get/SetFaceTextureSet


Наткнулся на ЭТО, но инфы крайне мало...


Человек человеку - волк, а зомби зомби - зомби.
Multigone  Offline  Сообщение №3169 написано: 3 июля 2024, 10:42 | Отредактировано: Multigone - 3 июля 2024, 10:50



825
Stea1ch, это скрипт для управления составляющими формы с типом TextureSet. Функции позволяют узнать число слоев, используемых тем или иным TextureSet, и назначить слоям пути к другим текстурам. Изменения будут затрагивать всех пользователей этого TextureSet, и не запоминаются между игровыми сессиями. Слэши из путей либо такие же, как в винде, либо обратные (? уточнить). TextureSet'ы используются в том числе для HeadPart и Skin, и назначение TextureSet другой текстуры, по сути, почти эквивалентно замене HeadPart или Skin (таких же, но с другими текстурами).

Stea1ch  Offline  Сообщение №3170 написано: 3 июля 2024, 18:10



187
Цитата Multigone

и назначить слоям пути к другим текстурам.


На мой взгляд - то, что нужно. Если примет none в качестве аргумента - будет просто шикарно =))


Человек человеку - волк, а зомби зомби - зомби.
Multigone  Offline  Сообщение №3171 написано: 3 июля 2024, 18:46 | Отредактировано: Multigone - 3 июля 2024, 18:53



825
Stea1ch, SetNthTexturePath(Int n, String texturePath), как и любая другая функция, примет аргументы только тех типов и в том порядке, в каком виде она объявлена в соответствующем исходнике скрипта .psc, иначе пользовательский скрипт не скомпилируется с ошибкой. Для конкретно этой функции первым аргументом должен быть int (целое число), вторым string (текст). Текстовая перем. берется в кавычки и может быть пустой, типа так:
""

Значение none может быть присвоено скриптовым переменным, оперирующим формами СК.
TextureSet MySet = none


Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
  • Страница 106 из 106
  • «
  • 1
  • 2
  • 104
  • 105
  • 106
Поиск:





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