• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №391
написано: 7 октября 2013, 20:27
| Отредактировано: AleksTirex - 7 октября 2013, 21:33
можно ли в Папирусе можно создать двухмерный массив
Не уверен, но вроде бы нельзя.
Array = {1,2,3} не многим отличается от Array[1]=1, Array[2]=2, Array[3]=3 , есть ли смысл заморачиваться? Если массив объектный, то можно форм-лист составить, если цифровой, то можно циклом прописать используя коэффициент (*2.3 или /1.28 или + 1 и т.д). А если цифры хаотичные, то проще вручную прописать Array[1]=1, Array[2]=2, Array[3]=3
Если это для времени анимации, то лучше вручную, т.к. всё равно придётся корректировать не один раз.
Нет, не для времени анимации, но для определения какая анимация может запустится следующей, в зависимости от того, какая только что закончилась.
В общем, идея мода такая: Должно получиться развлекалочка, типа "Emotes", как оно есть в ММО типа Тера, Аион и т.п.. ГГ получает "малую способность", при активации которой стартует моя анимация (а точнее их набор) добавленные в игру с помощью FNIS. Анимация имеет начало, несколько лупов, которые рандомно меняются, и конец. Анимация играет бесконечно, до тех пор, пока пользователь снова не нажмёт кнопку использования "малой способности". Только тогда проигрывается конец. Основа уже есть и прекрасно работает. Осталось подкорректировать анимации, чтобы были плавные переходы, и написать правила их вызова. Вот чтобы эти правила было легче писать я и хотел создать матрицу допустимых вариантов, и потом после каждого рандома проверять, можно ли запустить новую анимацию, или запустить рандом снова.
Можно и "провиртуалить" массивы, но можно и просто сделать два массива (строковый и числовой) с равной длиной, где порядок заполнения будет соответствовать друг другу: anim[0] - анимашка №1 fTime[0] - время работы анимашки №1 anim[1] - анимашка №2 fTime[1] - время работы анимашки №2 (пример такого использования чуть ниже)
"допустимых вариантов" - а что, есть несовместимые анимации? И много ли таких вариантов?
Возможно, проще разбить анимации по своим массивам по принципу совместимости. Или индексировать анимации по совместимости, например, несовместимые раскидывать в начало и конец массива. Тогда:
int index While ... if index < 5 ;активная анимашка в зоне плохой совместимости index = RandomInt(0, 20) ;после 20 идут анимашки с плохой совместимостью с анимашками 0-5 elseif index > 20 index = RandomInt(5, 25) else index = RandomInt(0, 25) endif SendAnimationEvent(player, anim[index]) Wait(fTime[index]) ... endWhile
Изменение репутации для пользователя anton
antonOffline
Сообщение №394
написано: 8 октября 2013, 18:30
| Отредактировано: anton - 8 октября 2013, 18:32
а что, есть несовместимые анимации? И много ли таких вариантов?
Ещё как есть, и чем больше вариантов анимаций - тем больше несовместимостей.
К примеру, у меня уже готовы 4 повторяемые анимации: (1) Есть луп покачивания в положении лёжа. (2) Есть переход из положения лёжа в положение сидя. (3) Есть луп покачивания в положении сидя. (4) Есть переход из положения сидя в положение лёжа.
Так вот: - если выполнилась анимация (1), то следующей можно выполнить только анимации (1) или (2). - если выполнилась анимация (2), то следующей можно выполнить только анимацию (3). - если выполнилась анимация (3), то следующей можно выполнить только анимации (3) или (4). - если выполнилась анимация (4), то следующей можно выполнить только анимацию (1).
Если эти правила не прописать, переходы будут дёрганные и не логичные. Выглядеть это будет ужасно. Я проверял
Как их упорядочить пока не представляю. Тем более, что на подходе ещё 4 анимации. А там может и больше добавлю...
Самый лучший способ на данный момент, который я придумал, это создать такую себе матрицу вариантов. Строкой матрицы - будет индекс выполнившейся анимации, а с ячейках каждой строки - всевозможные разрешённые (или запрещённые) индексы анимаций. Потом делаем цикл, в котором генерим случайное число из диапазона всех анимаций и проверяем его на пригодность. Если оно, допустим, не совпало ни с одним элементом соответствующей строки - значит анимацию с этим индексом выполнить можно, цикл прерывается и анимация запускается. Иначе - генерим случайное число снова и опять проверяем его; и так до победного конца.
Алгоритм вроде бы достаточно линеен и прост. Реализовать не сложно. Жаль только что с массивами подизвратиться придётся.
подскажите где отключение перехода вида в этой строчке: Game.DisablePlayerControls(True, True, True, False, True, False, True)? мне просто нужно сохранение от первого лица в сцене а то эффект портиться. как не включаю/выключаю в игре колесо мыши крутану, и вид меняется...
читал её... ставил, но стоит в игре повернуть колесо мыши от 3 лица вид(
нифига не выходит... надо отключить практически всё управление, ато портится вся картина((
вот скрипт:
ObjectReference Property Point1 Auto ObjectReference Property Point2 Auto ObjectReference Property Point3 Auto ObjectReference Property Point4 Auto ObjectReference Property Point5 Auto ObjectReference Property Point6 Auto ObjectReference Property Point7 Auto ObjectReference Property Panel Auto ObjectReference Property mySound Auto
Event OnTriggerEnter(ObjectReference akActionRef) If akActionRef == Game.GetPlayer() ; Limit this trigger to the player only. Game.GetPlayer().SetAlpha(0) Game.GetPlayer().SetGhost(True) Game.DisablePlayerControls(1, 1, 1, 0, 1, 0, 1); Блокировка всего управления кроме обзора. Utility.Wait(0.1) Game.GetPlayer().TranslateToRef(Point1, 200) Utility.Wait(0.0) Game.GetPlayer().TranslateToRef(Point2, 200) Utility.Wait(0.0) Game.GetPlayer().TranslateToRef(Point3, 200) Utility.Wait(0.0) Game.GetPlayer().TranslateToRef(Point4, 200) Utility.Wait(0.0) Game.GetPlayer().TranslateToRef(Point5, 200) Utility.Wait(0.0) Game.GetPlayer().TranslateToRef(Point6, 200) Utility.Wait(0.0) Game.GetPlayer().TranslateToRef(Point7, 200) Utility.Wait(0.0) Panel.Disable() Game.GetPlayer().SetAlpha(1) Game.GetPlayer().SetGhost(False) Game.EnablePlayerControls() EndIf EndEvent
Нарисовалась пара вопросов: 1. куда цеплять SKSE скрипты типа FormScript? 2. Есть ли возможность в Quest Script определить, когда управление ГГ передано AI в сценах (как например в начале игры в Хелгене)? 3. Что не так в скрипте?
Quest property aaAlliriaRCRwaStartQuest auto Quest property aaAlliriaRCRwaUpdateQuest auto Spell Property AbAlliriaRCRMaterialAbility auto ;bool Function HasSpell(Spell AbAlliriaRCRMaterialAbility) native Bool clearAliasARCR Int i = 0 Int j = 0 ReferenceAlias refAliasARCR ReferenceAlias objAliasToAddARCR ObjectReference objRefARCR ObjectReference objRefToAddARCR
********* TranslateToRef() - это не латентная функция, в отличии от Wait(), скрипт не будет ждать её исполнения, а сразу же начнёт исполнять следующую команду. Для "ожидания" есть своё событие OnTranslationComplete(). Поэтому можно было сразу написать Game.GetPlayer().TranslateToRef(Point7, 200), т.к. только эта функция будет работать (она заменит все предыдущие). Писать Utility.Wait(0.0) не стоит - время нулевое, поэтому никаких действий не будет.
Можно ли сделать скрипт на кольцо, который бы при одевании и снимании кольца менял один Outfit персонажа, одевшего кольцо, на другой? Поясню. В игре есть объекты Outfit. Это списки, содержащие элементы брони и одежды. Каждому персонажу (кроме ГГ) в игре назначен один из стандартных Outfit. Персонаж одевает всё, что есть в этом списке, пока ГГ не возьмёт его в компаньоны. Но когда персонаж будет взят на службу, броня из Outfit будет замещаться на то, что будет выдано игроком персонажу, но только в том случае, если новая шмотка круче по мнению компьютера. В результате, хускарлов игрок не может переодеть в платье или раздеть. Мне нужно кольцо, которое можно было бы дать компаньону так, чтобы оно сделало Outfit персонажа пустым. Я вижу это так. Папирус позиционируется как объектно-ориентированный язык, значит, надо для каждого экземпляра кольца создать две локальные переменные со ссылками на Outfit0 и Outfit1. В игре создать пустой Outfit0. При одевании кольца заменять Outfit1 на Outfit персонажа, а Outfit персонажа на Outfit0. При снимании кольца операция проходит наоборот. Проблема в том, что я не знаком с папирусом. Поэтому подскажите, возможно ли это, или не стоить терять время, и, если возможно, то с чего надо начинать копать и что брать за прототип.
Писать Utility.Wait(0.0) не стоит - время нулевое, поэтому никаких действий не будет.
я знаю просто время вылавливал... лучше поясни по скриптам что не так.. я пробовал включать каждый параметр отдельно и с 0/1 и с false/true... почемуто дергая колесо менялся вид с первого лица на вид от третьего
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №402
написано: 17 октября 2013, 13:30
| Отредактировано: AleksTirex - 17 октября 2013, 13:46
Без SKSE не узнать, какой именно оутфит носил НПС.
Возврат ВСЕЙ одежды обратно ГГ необходим потому, что при смене оутфитов одежда бесследно удаляется у НПС (не только надетая, а практически вся броня и шмотки, кольца и амулеты не исчезают, это дефолтный баг/эффект). Для упрощения сделан возврат игроку всего содержимого инвентаря непися (можно и только одежду возвращать, но тогда скрипт заметно усложнится). В блоке OnEquipped команду на удаление вещей можно и не писать, если игрок предварительно заберёт сам всю одежду у НПС, но это неудобно. Но здесь есть "баг" - броня-оутфит тоже перемещается к ГГ. Чтобы было всё красиво и без недостатков, надо заметно усложнить скрипт.
AleksTirex, огромное спасибо! Одна беда, вопрос я задавал, ещё находясь дома, а сейчас отвечаю, уже и гостиницы в Армении, где у меня нет ни редактора ни Скайрима. Ничего, через несколько дней буду всё это отрабатывать.
Myprism, так же попробуй вариант не с перемещением вещей НПС к игроку, а с сундуком. Т.е. сперва все вещи НПС перемещаешь в свой сундук, потом меняешь оутфит, а после этого из того сундука все вещи возвращаешь НПС. Какой вариант больше понравится.
При попадании плевка паутиной. Персонаж(ГГ/НПС) падает на землю и начинает извиваться. пауки теряют к нему интерес. Через некоторое время паутина истаевает или персонаж её разрывает. Контроль за персонажем полностью отключается, пока он облеплен паутиной. После окончания эффекта, некоторое время плевки не оказывают действия. Я добавил - возможность управлять камерой(гораздо интересней когда её можно покрутить) - подключил звук(ато извивался молча)
Вопросы 1. Скрипт работает. Можете оценить насколько он безопасен для сейвов? 2. Можно ли заблокировать доступ в инвентарь, оставив при этом доступ в меню магии? Параметр abJournalTabs в DisablePlayerControls блокирует слишком много 3. Случайно не знаете где находится подходящий звуковой файл? Никак не могу найти звук дыхания во время спринта.
If Victim == Game.GetPlayer() Game.EnablePlayerControls() ;Victim.StartCombat(Spider) Else Victim.SetUnconscious(false) EndIf
EndFunction
Idle Property mslZaZAPWebbed Auto Actor Property Victim Auto Actor Property Spider Auto Armor Property mslZaZAPWebbing Auto Armor Property mslZaZAPWebBody Auto GlobalVariable Property mslZaZAPDelayInit Auto GlobalVariable Property mslZaZAPDelayUpdate Auto GlobalVariable Property mslZaZAPDifficulty Auto EffectShader Property WebbedFXS Auto
int Property aiInstanceID Auto Sound Property SoundMale Auto Sound Property SoundFemale Auto
Ребята, подскажите, как НПС назначить нужный пакет через диалог? То есть у НПС его изначально нет, но мне нужно пакет назначить по одной ветке диалога, а по другой пакет убрать...
Назначать пакету кондишн и управлять стадиями как-то сильно уж смахивает на забивание гвоздя микроскопом...
Буду благодарен за любую подсказку.
Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ <a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Изменение репутации для пользователя Myprism
MyprismOffline
Сообщение №407
написано: 19 октября 2013, 23:47
| Отредактировано: Myprism - 20 октября 2013, 10:10
VALKNUT, как я понимаю, в результате диалогов меняются числовые параметры игрока. Например, у НПС стоит, что он может следовать за игроком, но возможности следования присвоена цифра -1. В результате диалога она меняется. В параметрах пакетов же есть условия их выполнения. Т.е. пакет не ставится НПС в процессе игры, он там уже должен стоять, но в процессе игры меняются условия, которые включают тот или иной пакет.
Myprism, ну... в обычных случаях я так и делал, а вот допустим я не знаю заранее, что за НПС получит от меня пакет(ветку диалога) всем НПС добавлять пакет на перспективу не есть правильно...
Суть того, что делаю. Условия: спутник или супруг (проверка выполняется на уровне диалога, тут все просто)
Диалог1: Жди в месте "Х" Действие1: НПС топает по воле пакета
Диалог2: Все. За мной. Действие2: НПС избавляется от пакета
Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ <a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
AleksTirex, я в папирусе пока новичок. Как компилировать скрипт использующий функции из СКСЕ? Компилятор же выдаёт ошибки: (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 поставил 1_06_16. Может, там надо давать ссылку на конкретный скрипт из SKSE?
Оп! Причину нашёл. Оказывается, надо ставить SKSE не в виде инсталлера, а в виде зип-архива. Они различаются папкой src, которая инсталлером не ставится. С ней всё скомпилировалось!
Добавлено (21 Октября 2013, 21:06) --------------------------------------------- AleksTirex, ну вот, пошли первые результаты! Прежде всего, ещё раз хочу поблагодарить за пропуск мне в мир скриптов. Мне, главное, нужно было получить образец, зацепку, которую я дальше буду изменять.
Результаты очень интересные. Строка akActor.RemoveAllItems(Game.GetPlayer()) оказалась не нужна вообще. Дело в том, что в игре есть фича восстановления персонажей в исходное состояние. Она действует так: после удаления последней шмотки полностью восстанавливается до Оутфит одёжка персонажа. Так, например, аналогичной консольной командой раздеть персонажа не получится, так как он тут же оденется. То же самое оказалось и тут. Но выяснилась одна деталь: этот механизм восстанавливает персонажа не до нового оутфита, а до родного игрового. Таким образом, эта строка полностью отменяет все действия скрипта. А вот убирание этой строки (два раза, естественно), дало как раз такой результат, как нужно. При этом при выдаче кольца, оутфит полностью пропадает, но восстанавливается, если кольцо забрать назад.
Результаты очень интересные. Строка akActor.RemoveAllItems(Game.GetPlayer()) оказалась не нужна вообще.
Должен огорчить - нужна эта команда. Если её нет, то при смене оутфита из инвентаря НПС-компаньона пропадёт одежда, практически вся, которую ты туда положил, что весьма жалко.
Вот посмотри: 1. На НПС одежда из родного оутфит, ты поменял оутфит и НПС теперь имеет новую одежду (или ничего, если оутфит пустой). 2. Теперь ты удалил всё из инвентаря НПС, он типа опять оделся в одежду из родного оутфит. После этого меняешь оутфит на новый и... и получаешь 100% эффект из пункта №1.
К тому же, при смене оутфита старые шмотки автоматически удаляются из инвентаря. Т.е. разницы быть не должно ни при каком варианте, если скрипт написан правильно и пустой оутфит сделан и назначен тоже правильно. Оутфит сменится в любом случае, у НПС не может остаться старый родной.
Если все потенциальные актёры - уникальные, то можешь поиграться с актёр-базовый актёр. akActor.SetOutfit(kOutfitEmpty) akActor.GetActorBase().SetOutfit(kOutfitEmpty) Результаты таких команд разные.
*******************
VALKNUT, пакеты добавляются через алиасы или сцены. Если пакет долговременный (не на пару минут), то делаешь алиас, в него добавляешь нужный пакет, потом в топике akMyAlias.ForceRefTo(akSpeaker). И теперь говорящий прописан в алиас, а на алиасе пакет, и пакет получится на этом актёре. Для удаления пакта - akMyAlias.Clear(). Если НПС принадлежит нескольким алиасам, то приоритетный пакет тот, чей квест имеет выше приоритет.
Изменение репутации для пользователя VALKNUT
VALKNUTOffline
Сообщение №412
написано: 22 октября 2013, 03:38
| Отредактировано: VALKNUT - 22 октября 2013, 03:55
VALKNUT, пакеты добавляются через алиасы или сцены.
Благодарю! Я нашел в инете твой тутор по этой теме, со скриншотами. Делал как в примере 2. Но при компиляции выскакивает ошибка.
Код
Starting 1 compile threads for 1 files... Compiling "VKN__TIF__0101CD85"... F:\games\steam\steamapps\common\skyrim\Data\Scripts\Source\temp\VKN__TIF__0101CD85.psc(9,9): ForceRefTo is not a function or does not exist No output generated for VKN__TIF__0101CD85, compilation failed.
Batch compile of 1 files finished. 0 succeeded, 1 failed. Failed on VKN__TIF__0101CD85
Код
Starting 1 compile threads for 1 files... Compiling "VKN__TIF__0101CD88"... F:\games\steam\steamapps\common\skyrim\Data\Scripts\Source\temp\VKN__TIF__0101CD88.psc(9,9): Clear is not a function or does not exist No output generated for VKN__TIF__0101CD88, compilation failed.
Batch compile of 1 files finished. 0 succeeded, 1 failed. Failed on VKN__TIF__0101CD88
Что-то я видать недопонял...
Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ <a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
2. Теперь ты удалил всё из инвентаря НПС, он типа опять оделся в одежду из родного оутфит. После этого меняешь оутфит на новый и... и получаешь 100% эффект из пункта №1.
А вот тут нет. Движок игры при опустошении инвентаря ставит старый оутфит и игнорирует, что он был заменён. У персонажа он был заменён, но игра поставит старый. Реально это выглядит так: при одевании кольца герой на мгновение становится прозрачным, на второе мгновение - голым (в новом оутфите нет одежды), и тут же одевает старый оутфит. Дальше это можно продолжать до бесконечности Скорее всего, ставя новый оутфит, игра сама помнит дефолтный. А механизм "починки" инвентаря персонажа не чинит текущий оутфит, а возвращает дефолтный. Это пока первые результаты, а дальше мне предстоит играться тут много. Дело в том, что я не пустой оутфит использую. Там у меня компоненты тела. Я хочу не только дать возможность игроку без ограничений переодевать компаньона, но и менять ему модель тела, не используя реплейсеров для всей игры. Тут мне ещё придётся много играться с занимаемыми многокомпонентной бронёй слотами
Да, все персонажи - потенциальные компаньоны являются уникальными актёрами. Для следования нужно ставить отношения к главному герою, а это можно сделать только для уникальных актёров.
Немного из другой области, но всё равно, на всякий случай спрошу. В игре для персонажей предусмотрены два оутфита. Ещё и оутфит для сна. Пакеты позволяют его установить именно для сна, но в игре это не работает. На самом деле, во всём Скайриме разработчики установили спальный оутфит всего нескольким персонажам. Я проверил всех, не переодевается ни один. Как будто механизм предусмотрен, но почему то не работает. Может знаешь, как починить?
Kepper, а рядом врагов нет? А то там, скорее всего, надо бой останавливать сначала.
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Изменение репутации для пользователя Kepper
KepperOffline
Сообщение №417
написано: 22 октября 2013, 09:14
| Отредактировано: Kepper - 22 октября 2013, 09:17
Попробую но сомневаюсь, что отключение контроля игрока за ударами персонажа, поможет в этом случае. Ни же в этой же функции у меня стоит строка. Game.DisablePlayerControls(abMovement =true, abFighting = true, abCamSwitch = true, abLooking = false, abSneaking = true, abMenu = true, abJournalTabs= true) Проблема в том, что после этого DisablePlayerControls, если ГГ был в боевой стойке, то он вращается за движением мышки.
Изменение репутации для пользователя Alliria
AlliriaOffline
Сообщение №418
написано: 22 октября 2013, 10:30
| Отредактировано: Alliria - 22 октября 2013, 10:41
VALKNUT, та же самая фигня в скрипте алиаса, только с функциями GetActorReference() и GetReference(). по-моему, это глюк конструктора. Есть хитрожопый вариант. Открываем ReferenceAlias.psc (дефолтный скрипт), выделяем все, кроме первых двух строк, и копируем в конец Alias.pcs (скрипт SKSE). Компиллируем Alias.pcs. Вуаля, все компиллируется.
Kepper, кстати, посмотри для примера квест Лекарство от безумия (это линейка ТБ). Там в определённый момент (когда добираемся до Цицерона) ГГ насильно зачехляют оружие и не дают его обнажить.
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Открываем ReferenceAlias.psc (дефолтный скрипт), выделяем все, кроме первых двух строк, и копируем в конец Alias.pcs (скрипт SKSE). Компиллируем Alias.pcs. Вуаля, все компиллируется.
А я не юзаю СКСЕ... по крайней мере в модах своих..
Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ <a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)