• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Нарада, в Скайриме есть одна общая система гонцов, которую многие квесты используют. Там всё использование сводится к созданию одной проперти и вызову одной функции с указанием предмета, который гонец должен вручить. Конечно, использовать именно эту систему не обязательно, но можешь посмотреть, как она работает... Вот только название квеста забыл Вроде, что-то со словом "courier".
Нашел квекст гонца - WICourier. Если я правильно понял, то тут нужно добавить моеПроперти на моеПисьмо и в скрипт - свою функцию на обработку моеПроперти. Ну еще можно диалог или обойтись имеющимися обозначив соответствующий GetItemCount. Все верно?
По-моему, там еще была другая функция, кроме addRefToContainer, принимающая не референс, а базовый объект. Book - это же не референс. А может, можно и так... А, ладно, я, лучше, не буду лезть. Помню плохо, а проверить не могу.
Изменение репутации для пользователя Нарада
НарадаOffline
Сообщение №1896
написано: 19 октября 2015, 17:52
| Отредактировано: Нарада - 19 октября 2015, 17:55
Там есть функция addItemToContainer. Но засада не в этом, все дело в том, что в числе Тип Проперти WICourierScript я не обнаружил. И вообще прямого обращения к скриптам через Проперти я не нашел. Может быть, чего-то недопонимаю? Может быть обращаться нужно через Проперть квеста?
Можно проперти с типом Quest, а потом вот так: (WICourier As WICourierScript).addItemToContainer(MyLetter)
Но лучше все-таки в тип проперти сразу прописать WICourierScript. Для лучшего понимания того, чем вообще являются эти проперти.
Добавлено (19 Октября 2015, 21:06) --------------------------------------------- И я не уверен, что скрипт называется именно WICourierScript... Может, как-то иначе... Но да, это тот скрипт, на котором addItemToContainer...
Изменение репутации для пользователя keboard
keboardOffline
Сообщение №1898
написано: 20 октября 2015, 20:11
| Отредактировано: keboard - 21 октября 2015, 01:34
Приветствую всех, пытаюсь сделать спелл, возник вопрос по скриптам, подскажите, пожалуйста.
Тип спелла - кастанул и забыл на цель.Что происходит с целью - врубается анимация bleedout (такая, когда у бессмертных нпс заканчивается хп и они падают на колени), при этом цель ничего не может делать и находится в таком состоянии пока не закончится действие спелла либо она не умрёт. В общем - что-то типа парализа, но с нормальной анимацией.
Scriptname Bleedout extends ActiveMagicEffect
Event OnEffectStart(Actor akTarget, Actor akCaster) ; Определяем ХП цели Float currentHealth = akTarget.GetActorValue("Health") Float percentHealth = akTarget.GetActorValuePercentage("Health") Float maxHealth = currentHealth / percentHealth Float dmgHealth = maxHealth - currentHealth ;Включаем анимацию и делаем цель невосприимчивой Debug.SendAnimationEvent(akTarget, "BleedOutStart") akTarget.SetUnconscious(true) ;Восстанавливаем ХП цели akTarget.ForceAV("Health", maxHealth) akTarget.DamageAV("Health", dmgHealth) EndEvent
Event OnEffectFinish(Actor akTarget, Actor akCaster) ;Отключаем анимацию и делаем цель восприимчивой akTarget.SetUnconscious(false) Debug.SendAnimationEvent(akTarget, "BleedOutStop") EndEvent ;===========================================
Проблема в том, что функция Actor.GetActorValuePercentage работает некорректно, возвращает не то, что должна. В SKSE есть GetMaximumValue, но я не совсем понимаю на чём её вызывать и как вообще использовать.
P.S. Извиняюсь, если вопрос покажется совсем нубским, это моя первая попытка работы со скриптами, буду рад любым вариантам, заранее благодарю!
По-моему, ты круто запутался и было бы хорошо начать всё с нуля... Заодно почитай, что делает функция ForceAV. Она не восстанавливает аттрибут, а перманентно меняет максимальное значение. Но только не подумай, что проблема только в ней.
По-моему, ты круто запутался и было бы хорошо начать всё с нуля...
Да что там с нуля то начинать - три строчки кода омфг, если шаришь, то просто напиши как корректно определить текущее и макс хп цели и после установить цели эти значения, если не сильно трудно, разумеется, я был бы весьма признателен.
Попробуй в первой версии скрипта заменить ForceAV на RestoreAV
Спасибо за наводку, удалось решить проблему с хп, кстати, методом тыка установлено:
пусть изначально
текущее значение = X максимальное = Y
используем ф-цию
ForceAV <value> Z
теперь станет так
текущее значение = Z максимальное = Z + (X - Y)
пусть изначально
текущее значение = X максимальное = Y
используем ф-цию
SetAV <value> Z
теперь станет так
текущее значение = Z - (X - Y) максимальное = Z
Возник вопрос по поводу анимации - при повторном использовании спелла на цель, которая уже под его воздействием, анимация выключается, юзаю снова - включается и так далее вкл выкл вкл выкл, увловие вроде правильно настроил, не пойму что не так...
Там сложнее. Для каждой характеристики (в том числе для health) хранится, как минимум, три значения: 1. Базовое. 2. Модификаторы (Баффы, дебаффы итп. Если положительное, характеристика в игре подсвечивается зеленым, а если отрицательное - красным.). 3. Повреждение.
GetBaseActorValue возвращает базовое значение. GetActorValue возвращает текущее значение с учетом всего (базовое + модификаторы - повреждение) SetActorValue устанавливает базовое значение. ModActorValue увеличивает или уменьшает модификаторы. ForceActorValue изменяет модификаторы так, чтоб максимальное значение (базовое + модификаторы) равнялось переданному в функцию.
Добавлено (23 Октября 2015, 02:23) --------------------------------------------- Если кто-то собирается из скрипта изменять базовое значение или модификаторы, не забывайте, что пользователь может отключить ваш мод в любой момент. Даже во время действия магического эффекта. Тогда OnEffectFinish никогда не выполнится и характеристики останутся поврежденными. Намного лучше изменять их самим магическим эффектом, без скрипта. Тогда отключение мода отключит и эффект.
Я так понимаю, что независимо от того истекает ли время действия эффекта или он применяется повторно до истечения времени - мы в любом случае попадаем в OnEffectFinish. Можно ли определить, какая из этих двух причин нас туда привела?
Повесил условие HasMagicEffect - эффект не накладывается повторно пока предыдущий не спадёт, но косяк с анимацией всё равно полностью не вылечился - если кастануть спелл на цель, когда предыдущий эффект только закончился и она "в процессе вставания с колен" xD - анимация "вернуться на колени" не срабатывает, она как бы зависает в положении стоя.
ребят, можете подсказать какой скрипт использует стремительный рывок ?
Добавлено (30 Октября 2015, 02:00) --------------------------------------------- при компиляции скрипта выскакивает эта ошибка "QueueNiNodeUpdate is not a function or does not exist" что не так ?
Компилятор же выдаёт ошибки: (9,36): GetOutfit is not a function or does not exist (12,11): QueueNiNodeUpdate is not a function or does not exist (21,10): QueueNiNodeUpdate is not a function or does not exist
Оп! Причину нашёл. Оказывается, надо ставить SKSE не в виде инсталлера, а в виде зип-архива. Они различаются папкой src, которая инсталлером не ставится. С ней всё скомпилировалось!
Изменение репутации для пользователя nine-dragon-art
nine-dragon-artOffline
Сообщение №1912
написано: 1 ноября 2015, 16:32
| Отредактировано: nine-dragon-art - 1 ноября 2015, 16:51
можете скрипт подсказать чтобы при использовании заклинания (огненный шар например) у игрока уменьшалось здоровье на 50 единиц ?) желательно чтобы здоровье отнималось у игрока во время каста.
nine-dragon-art, можешь попробовать ловить событие OnAnimationEvent(), где проверять, к примеру, если это BeginCastRight или BeginCastLeft (ну или может что-то более подходящее найдешь), и player.GetEquippedSpell() == <нужное заклинание>, то вычитать здоровье у игрока.
nine-dragon-art, спасибо. А по какому событию инициируется диалог и происходит проверка этих условий?
Добавлено (18 Ноября 2015, 21:22) --------------------------------------------- Специалисты по скриптам, нужна ваша помощь. Для NPS Скайрима можно установить спальный Outfit/ Но работать он не будет. Он установлен примерно четырём сотням игровых персонажей, но галка применять его в спальных пакетах стоит всего у нескольких и они, не смотря на это, не переодеваются на ночь. Т.е. использование спальной одёжки в игре не активно. Для персонажей своего мода я решил эту проблему, повесив на них следующий скрипт:
Scriptname aaSleeping extends Actor
Package Property akPackageSleep Auto Outfit kOutfit0 Outfit kOutfit1 ;Сон
Event OnPackageStart(Package akNewPackage) if akNewPackage.GetTemplate() == akPackageSleep ; пакет начался, НПС идёт к кровати kOutfit0 = GetActorBase().GetOutfit(false) kOutfit1 = GetActorBase().GetOutfit(true) endif endEvent
Event OnPackageEnd(Package akOldPackage) if akOldPackage.GetTemplate() == akPackageSleep ; пакет продолжается, НПС лёг на кровать SetOutfit(kOutfit1) endif endEvent
Event OnPackageChange(Package akOldPackage) if akOldPackage.GetTemplate() == akPackageSleep ; пакет закончился, НПС встал с кровати SetOutfit( kOutfit0) endif endEvent
Он делает то, что надо для моих персонажей: они переодеваются, когда ложатся в постель. Теперь я хочу реализовать эту функцию для многих уже ванильных персонажей. Тут я сталкиваюсь с проблемой, что скрипт работает только на уникальных персонажах, а многие игровые персонажи не уникальны. Кроме того, игровых персонажей ОЧЕНЬ много и надо каждому ставить скрипт. Может быть есть способы улучшить этот процесс? Т.е. нужно 1. Реализовать переодевание на ночь и для неуникальных персонажей. 2. Может быть это можно сделать с помощью скрипта, повешенного на кровать? Кроватей в Скайриме не много и этот метод кажется красивее. Как это можно сделать?
Изменение репутации для пользователя andrelo-1
andrelo-1Offline
Сообщение №1917
написано: 18 ноября 2015, 19:42
| Отредактировано: andrelo-1 - 18 ноября 2015, 20:00
Myprism, а почему для неуникальных это не работает ? На мой взгляд, это проще всего сделать внутри пакета, так как скорее всего все нпц используют один и тот же пакет для сна.
Изменение репутации для пользователя Myprism
MyprismOffline
Сообщение №1918
написано: 18 ноября 2015, 20:10
| Отредактировано: Myprism - 19 ноября 2015, 05:19
andrelo-1, функция GetActorBase().GetOutfit(true) существует только для уникальных персонажей. Она обращается к ActorBase. Пакеты сна очень разные и их много. Для сна может использоваться даже пакет песочницы, так как там по умолчанию стоит флаг "позволить спать".
Заменил ещё определение типа спального пакета на состояние сна. На уникальных персонажах вроде работает (на тех, с кем ещё не встречался в данном сохранении), а на стражниках - нет Ещё выяснилась неприятная деталь: скрипт не вешается на Template, а только на конечного персонажа. Т.е. нельзя ограничиться установкой скрипта на нескольких заготовочных персонажей, а надо на всех конечных. Впрочем, всё равно не работает
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)