• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
; нужен тест ; на эффект зелья (FF-Self, какая-то длительность действия) ; заполнить Property
HeadPart Property MyHeadPart Auto ; модные глаза, доступные всем расам
Spell Property MySpell_1 Auto Spell Property MySpell_2 Auto Spell Property MySpell_3 Auto ; пассивные эффекты - заклинания Ability-Constant-Self
HeadPart CurrentHeadPart
EVENT OnEffectStart(Actor xT, Actor xC) IF xT != Game.GetPlayer() || xT.IsOnMount() Dispel() RETURN ENDIF GoToState("Work") ActorBase xB = xT.GetBaseObject() AS ActorBase Int iC = xB.GetNumHeadParts() - 1 WHILE iC >= 0 && xB.GetNthHeadPart(iC).GetType() != 2 iC -= 1 ENDWHILE CurrentHeadPart = xB.GetNthHeadPart(iC) xT.ReplaceHeadPart(CurrentHeadPart, MyHeadPart) xT.QueueNiNodeUpdate() xT.AddSpell(MySpell_1, false) xT.AddSpell(MySpell_2, false) xT.AddSpell(MySpell_3, false) ENDEVENT
STATE Work EVENT OnEffectFinish(Actor xT, Actor xC) xT.RemoveSpell(MySpell_1) xT.RemoveSpell(MySpell_2) xT.RemoveSpell(MySpell_3) xT.ReplaceHeadPart(MyHeadPart, CurrentHeadPart) WHILE xT.IsOnMount() Utility.Wait(1.0) ENDWHILE xT.QueueNiNodeUpdate() ENDEVENT ENDSTATE
Если не лень разбирать скрипты, вот мод с примерно тем же.
Привет! Подскажите как посчитать вещи одетые на персонажа с определенным кейвордом. if Game.GetPlayer().WornHasKeyword(ArmorType) - эта конструкция возвращает true. А точное кол-во как получить?
Без SKSE - есть Conditions (WornApparelHasKeywordCount, см. PerkMatchingSet). Со SKSE - проверяются и считаются предметы, надетые в соотв. слоты актера (GetWornForm(int slotMask), применение см. в Armor.psc).
Изменение репутации для пользователя mka_n
mka_nOffline
Сообщение №2974
написано: 3 октября 2020, 13:58
| Отредактировано: Multigone - 4 октября 2020, 11:13
Multigone огромное Вам спасибо. а Вы не подскажите как можно ввести этот скрипт без Creation Kit?А то у меня это прога постоянно вылетает когда пытаюсь войти в закладку скриптов.
VictorCorvin, никак. Нужно разобраться, почему вылетает, это не нормальное поведение СК. В общем случае:
Для изменения Property ванильных скриптов (.pex), они должны быть распакованы из Skyrim - Misc.bsa в Data/Scripts (туда же скрипты из DLC). Для просмотра текста скриптов и компиляции, их исходники (.psc) должны находиться в Data/Scripts/Source (исходники не поставляются с игрой с какой-то версии, их нужно качать отдельно, где именно - без понятия, у меня нет лиц. Скайрима). Если подключенный мод использует SKSE, но SKSE не установлено в файлы игры, возможны вылеты из нее (насчет СК - без понятия). В SE версии Скайрима, возможно, есть какие-то фундаментальные отличия в работе скриптов (не в курсе, вот соотв. раздел).
Виктор Корвин, для конвертации из pex в psc, и обратно - существуют утилиты. "Качать исходники" нет необходимости, их можно получить и самому. Лично я, давно и успешно, использую вот этот пакет. Вот его дословный текст рекламки: "Уникальная программа, которая очень поможет модермейкерам, которые работают со скриптами. Большинство авторов пытаются скрыть написанный скрипт и просто удаляют его оставляя только компилированный файл в расширении .pex, но эта программа поможет нам вытащить из него скрипт! Как это делается? Да просто, для начала распакуем всё из архива в папку, я назвал её: Декомпиляция, далее устанавливаем vcredist файл, берём любой .pex файл и нажимаем открыть с помощью, находим нашу папку Декомпиляция и файлик "Champollion", открываем с помощью него и он выдаёт нам текстовый файл со скриптом. Аллилуя! Спасибо Фантому! Автор: li1nx. Ссылка.
С уважением. Маг Иридий.
Изменение репутации для пользователя CYNIC78
CYNIC78Offline
Сообщение №2978
написано: 14 октября 2020, 15:05
| Отредактировано: Multigone - 18 октября 2020, 13:16
Всем привет. Я снова с вопросом по парным анимациям. С вашей помощью мои парные анимации работают отлично в том числе и в бою, персонаж больше не застревает в положении когда не может пользоваться магией\оружием пока не зайдет в инвентарь. Если кому интересно, вот пример кода
Код
Event OnEffectStart(Actor akTarget, Actor akCaster) Game.DisablePlayerControls() akTarget.StopCombat() akCaster.StopCombat() Utility.Wait(0.5) ;Персонаж и НПС прячут оружие и выходят из состояния боя, запускаем анимацию akCaster.PlayIdleWithTarget(pa_01, akTarget) Utility.Wait(3.5) ;Даем время анимации проиграться, затем возвращаем контроль игроку над персонажем и заставляем НПЦ и персонажа обнажить оружие akTarget.DrawWeapon() akCaster.DrawWeapon() Game.EnablePlayerControls() Endevent
Это работает с НПЦ, но вот с созданиями (creatures) у меня возникла проблема.
Я сделал специальные парные анимации human-wolf, зарегистрировал ивенты через FNIS - все как обычно. В CK создал соответсвующие айдлы, все ок. Но проблема в том, что мои ивенты это не killmove, а обычные парные анимации, то есть без убийства актера. Так вот, командой playidlewithtarget мои анимации не работают на животных. В качестве теста проверил свои анимации на ивенте killmove тупо подменив своей анимацией ванильную (paired_2hwkillmovewolfa.hkx) и она сработала. Но, естественно, после проигрывания актер (волк) умирает так как это ивент killmove. То есть проблема не в анимации, но вот в чем - понять не могу. В качестве костыля я уже думал может как нибудь воскрешать каждый раз актера после анимации, но этот вариант мне не нравится. Может кто нибудь подскажет.
Изменение репутации для пользователя DOOM2004
DOOM2004Offline
Сообщение №2979
написано: 16 октября 2020, 08:38
| Отредактировано: Multigone - 17 октября 2020, 20:54
Всем привет. Пишу сюда т.к коммерческая ветка кажется мертва. Суть вопроса: сделал левеллисты с одеждой дня npc, они её меняют только при disable/enable. Если видится решение готов обсудить, заранее спасибо.
Нужно чтобы меняли, например при посещении ГГ ячейки или в 00:00, или после сна, уж не знаю как буде проще реализовать и чтобы не было конфликтов с другими модами.
Я упоминал о мертвой коммерческой ветки, готов заплатить за проделанную работу.
Дум2004, тогда Вам нужно писать свой собственный скрипт. В котором как раз и прописать условия, что на что менять, когда и где. Одно только помещение в левел лист, само собой, автоматически - смены одежды Вам не обеспечит. Левел лист, это как шкаф или сундук, Вы в него что-то поместили - оно там и хранится вечно. Чтобы сменить одежду - надо открыть шкаф, снять старую одежду, повесить в шкаф, достать оттуда новую одежду, надеть/одеть её, закрыть шкаф.
DOOM2004, если вы изменили левельные списки, но персонажа уже встречали в игре, то его экипировка содержится в вашем сейве, т.е. старая. Вот поэтому вам приходится его переинициализировать, чтобы сгенерировать новую экипировку. Если вы начнёте игру заново, или встретите персонажа в первый раз, то его экипировка будет уже соответствовать новым левельным листам. Т.е. ваша проблема со старой одеждой не в моде, а в вашем сейве. Не очень представляю, как вам менять это скриптом. Ведь вам нужно переинициализировать всех персонажей, которых уже встречал пользователь вашего мода. А он этого захочет? Ведь запросто может быть, что игрок уже раздал персонажам какие-нибудь шмотки, которые он очень ценит, а ваш мод эти шмотки убьёт.
DOOM2004, хрень в том, что нормального (не костыльного) способа повесить скрипт на ВСЕХ НИП нет вообще. Когда об этом заходит речь, обычно единственное, что могут посоветовать, - это либо дать игроку огромную магическую ауру, которая будет вешать магический эффект на всех НИП, а на эффекте скрипт. Либо дать пассивное умение всем расам. Либо установить everynpcability в defaultobjects. Но решать проблему такими способами реально противно. Можно, но противно. В общем, сам скрипт - не проблема. Проблема в том, как его на всех повесить. А без скрипта мы ограничены в управлении одеждой НИП. Без скрипта они точно не сменят её "после сна", как вы хотите. Я делал похожий мод, но он управлял не всеми НИП, а только ограниченным количеством.
Добавлено (17 Октября 2020, 15:00) --------------------------------------------- Если без скриптов, то НИП тупо надевают свой outfit в момент загрузки модели и всё. С этим, вроде, даже баг связан. Можно взять талантик, позволяющий красть у НИП одежду, обокрасть НИП, а потом перезайти в локацию и он снова одет.
Изменение репутации для пользователя DOOM2004
DOOM2004Offline
Сообщение №2984
написано: 17 октября 2020, 14:40
| Отредактировано: Multigone - 17 октября 2020, 20:56
Всем привет. Подсобите ограничить "посадку" определенных трав, если не выполнены условия. Если я правильно понял то нужно на контейнере подправить скрипт.
Получилось такое:
Код
Keyword Property isNirnroot Auto function OnItemAdded(form akBaseItem, Int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) If akSourceContainer == Game.GetPlayer() if akBaseItem.HasKeyword(isNirnroot) Debug.MessageBox("1") else Debug.MessageBox("0") endif Endif endfunction
Проблема что всегда Debug.MessageBox("0") , хотя кейворд на Nirnroot есть.
и можно ли на контейнере проверять стадию квеста?
debug.Notification(NN01) int MyQuestStage = NN01.GetStage() debug.Notification(MyQuestStage)
На активаторе эта поделка работает(на контейнере none), но нужно чтоб если квест не выполнен то нельзя было посадить растение.
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №2986
написано: 21 октября 2020, 19:58
| Отредактировано: Dsion - 21 октября 2020, 19:58
mka_n, не уверен, что дело в этом, но игрок у тебя контейнер, а с контейнерами в игре есть тонкость. Много объектов помещённых в контейнер разом, не имеют индивидуальных ID. Если же в контейнер поместить n объектов по одному n раз, то ID им выделится. У меня было так: сделал я колечко со скриптом и положил 6 штук. в сундук, а колечки в игре не работают. Кладу их рядом с сундуком - работают. Если кладу 6 раз по одному в тот же сундук - работают. Т.е. ID присваивается только когда экземпляр объекта в сундуке один, либо имеет историю одного объекта.
mka_n, потому что проверяемый объект уже содержит в сохранении свою, предыдущую версию (Property) скрипта. Нужно: 1) подключить мод; 2) загрузить сохранение, где локация с этим объектом еще ни разу не посещалась; 3) идти и проверять. Еще можно попробовать сделать ему Reset(), но не уверен.
function OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) if akNewContainer == game.GetPlayer() as ObjectReference && akOldContainer == none if itemToAddPotion game.GetPlayer().AddItem(itemToAddPotion as form, ItemCount, true) endIf if (NN01.GetStageDone(200)) if itemToAddIngredient ;debug.trace(self as String + " akNewContainer = " + akNewContainer as String + ", akOldContainer = " + akOldContainer as String, 0) game.GetPlayer().AddItem(itemToAddIngredient as form, ItemCount, true) endIf else Debug.MessageBox("Качество хромает, похоже я пока не умею это сажать, нужно учиться") endIf game.GetPlayer().RemoveItem(myBase as form, 999, true, none) endIf endFunction
Работает(я даже проверли не забыл ли заполнить), криво конечно ,я хотел чтоб он вообще не давал его посадить. Наверно можно это де событие вызывать на самом INGR , но хз как будет это рабоать когда ты сразу стек кидешь а не по одному в грядку. Тут пишут что не всегда будет работать.
Друзья, а как вешать spell на противника при каждой физ.атаке? Что-то типа дебафа брони\резов...
Нужно чтобы меняли, например при посещении ГГ ячейки или в 00:00, или после сна, уж не знаю как буде проще реализовать и чтобы не было конфликтов с другими модами.
1. Неписи только именные, рандомы итак переоденутся. 2. Мне видится 2 варианта: - После сна. (Самый логичный) - По игровому времени после 00:00 3. SKSE установлен, так же установлен мод Dynamic Outfits (Basic Version) (https://www.nexusmods.com/skyrimspecialedition/mods/20748) С ним неписи одеваются скажем так по погоде автоматически, не знаю точно как это реализовано, но кажется через заклинания.
DOOM2004, для SSE есть отдельный раздел. В скриптах LE и SE, SKSE32 и SKSE64 наверняка есть какие-то отличия (не в курсе). SE мне неинтересен, т.к. нет игры, инструментов, а значит, и возможности тестирования. Могу написать для LE, но не гарантирую работу на SE. Во-вторых, в описании мода указано, что он влияет на большинство нпс, значит, для твоих именных в нем должны быть созданы исключения. Иначе создается конфликт, когда 2 независимых мода берут управление сменой одежды у конкретного нпс. Поэтому, либо Dynamic Outfits должен быть мастером для твоего мода (второй - патч для первого), либо вносить изменения непосредственно в Dynamic Outfits, либо отказаться от Dynamic Outfits в пользу собственного. Работать с Dynamic Outfits я не могу по вышеописанной причине.
Да, возможно есть отличия, мне не известно об этом. Я написал в эту ветку т.к не могу создавать темы, а в ветке SE нет подходящей. Если все же функционал окажется одинаков можно отказаться от Dynamic Outfits, возможно часть его функционала можно вписать в новый мод.
Добавлено (25 Октября 2020, 08:55) --------------------------------------------- Вот что пишут на Nexus:
1. This process will work for almost any mod, including mods that require SKSE. The only notable exceptions are certain SKSE mods that install a DLL. In some cases, the DLL may have to be modified/recompiled. If the mod you are porting contains a SkyProc Patcher, please read "Addendum 2."
Как понимаю если нет dll все должно работать обычными методами конвертации мода le -> se
Изменение репутации для пользователя mka_n
mka_nOffline
Сообщение №2996
написано: 25 октября 2020, 07:52
| Отредактировано: mka_n - 25 октября 2020, 07:52
mka_n, тебе уже ответили, как накладывать заклинание при атаке - дать атакующему перк и настроить его условиями и прочим. Отдельной функции в папирусе для этого, конечно же, нет. Есть событие OnHit(), с помощью которого определяется факт / момент атаки, RefID атакующего, его оружие и т.д. Но событие должно находиться в скрипте, запущенном на жертве. Значит, скрипт через заклинание / референс алиас должен быть повешен на нее ДО атаки. Там все сложно, тебе проще через перк.
; На ReferenceAlias конкретного актера (актеров). ; Все Property должны быть изучены и настроены перед первым запуском мода. ; Нужно больше тестов.
Outfit Property MyDailyOutfit Auto ; Модный дневной аутфит. Outfit Property MyPersonalOutfit Auto ; Модный ночной аутфит (если нет, оставить none). Outfit Property MySleepOutfit Auto ; Модный аутфит для сна (если нет, оставить none).
Float Property pfMorningTreshold = 7.00 Auto ; Время утренней смены одежды. Допустимые значения: 1.0 < pfMorningTreshold < 11.0 Float Property pfEveningTreshold = 22.00 Auto ; Время вечерней смены одежды. Допустимые значения: 13.0 < pfEveningTreshold < 23.0
Float Property pfBlockTimeScale = 300.0 Auto ; Актер не может менять одежду чаще, чем раз в (pfBlockTimeScale) реал. сек. Допустимые значения: pfBlockTimeScale >= 1.0 ; Надевание одежды для сна игнорирует это правило. Загрузка модели игнорирует это правило.
Faction Property CurrentFollowerFaction Auto ; Автозаполнение. ; Если заполнено: актер, находящийся в этой фракции, либо являющийся IsPlayerTeammate(), исключается из алгоритма смены одежды, пока проходит эти проверки.
GlobalVariable Property GameDaysPassed Auto ; Автозаполнение.
STATE Main EVENT OnLoad() IF MySleepOutfit (GetReference() as Actor).SetOutfit(none, true) ENDIF iAllowChange = 1 iCurrentOutfit = 0 UpdateGameTime() ENDEVENT
STATE Simple EVENT OnLoad() Actor xA = GetReference() AS Actor IF !CurrentFollowerFaction || (!xA.IsInFaction(CurrentFollowerFaction) && !xA.IsPlayerTeammate()) xA.SetOutfit(MyDailyOutfit) ENDIF ENDEVENT ENDSTATE
Float FUNCTION fMod(Float A, Float B = 1.0) IF B RETURN A - Math.Floor(A / B) * B ENDIF ENDFUNCTION
; Эта функция служит для остановки скрипта. ; Повторный запуск после остановки производится функцией: Update() ; Первый запуск при подключении мода происходит автомат.
FUNCTION Stop() GoToState("") UnregisterForUpdate() UnregisterForUpdateGameTime() Actor xA = GetReference() AS Actor xA.SetOutfit(VanillaDailyOutfit) xA.SetOutfit(VanillaSleepOutfit, true) ENDFUNCTION
Multigone, большое спасибо. Есть 2 вопроса: "Extends ReferenceAlias ; Multigone" Вот здесь прописывать список npc? с Property понятно, а в настройках npc важно какой Outfit выбирать или скрипт сам npc оденет?
DOOM2004, для каждого актера создается отдельный референс алиас квеста. Квест должен быть запущен. На все алиасы цепляется этот скрипт, заполняются необходимые проперти. Скрипт будет управлять сменой указанных в проперти аутфитов согласно времени суток и использованию нпс кровати (если указан аутфит для сна). Ванильные аутфиты не играют роли (только если у нпс есть ванильный сонный аутфит, а модный для сна не указан, тогда при впадании в сон нпс будет (предположительно) менять обычный аутфит на сонный, т.к. скрипт в этом случае не управляет этим). Первая смена аутфитов сразу в момент запуска мода в игре. Остановка скриптов и возврат ванильных аутфитов с помощью функции Stop(). Если удалить мод, не отключив, возможна (нужен тест) потеря аутфитов. Разбираться с Dynamic Outfits и распределением одежды по нпс желания никакого не имею, т.к. там работы явно не на одну неделю, куча подводных камней и долгое тестирование. Авторы таких модов пилят их долгое время, внося правки по отзывам.
Изменение репутации для пользователя frodo01
frodo01Offline
Сообщение №3000
написано: 6 декабря 2020, 17:09
| Отредактировано: Multigone - 7 декабря 2020, 18:59
установил мод bloodthirst что бы вампиры могли кусаться и подумал может дать им возможность заражать укусами напечатал скрипт и начал следить за Алвой ворвался к ней домой, её хахаль накинулся на меня а у Алвы проигралась анимация укуса и потом она приобретает уже внешность вампира
;-- Properties -------------------------------------- spell property DiseaseSanguinareVampirisNPC auto keyword property ActorTypeNPC auto actor property PlayerREF auto Idle Property VampireFeedingBedRight Auto Idle Property VampireFeedingBedrollRight Auto idle property IdleVampireStandingFeedFront_Loose auto idle property VampireFeedingBedRight_Loose auto idle property VampireFeedingBedrollLeft_Loose auto idle property VampireFeedingBedLeft_Loose auto idle property VampireFeedingBedrollRight_Loose auto idle property IdleVampireStandingBack auto ;-- Variables ---------------------------------------
;-- Functions --------------------------------------- function OnEffectStart(Actor Victim, Actor akCaster) ;-- akCaster(вампир) ;-- Victim(жертва) if Victim != PlayerREF if Victim.HasKeyword(ActorTypeNPC) If akCaster.PlayIdle(VampireFeedingBedRight) Victim.DoCombatSpellApply(DiseaseSanguinareVampirisNPC, Victim as ObjectReference) endif If akCaster.PlayIdle(VampireFeedingBedrollRight) Victim.DoCombatSpellApply(DiseaseSanguinareVampirisNPC, Victim as ObjectReference) endif if akCaster.PlayIdleWithTarget(IdleVampireStandingFeedFront_Loose, Victim as ObjectReference) Victim.DoCombatSpellApply(DiseaseSanguinareVampirisNPC, Victim as ObjectReference) endif if akCaster.PlayIdle(VampireFeedingBedrollRight_Loose) Victim.DoCombatSpellApply(DiseaseSanguinareVampirisNPC, Victim as ObjectReference) endif if akCaster.PlayIdle(VampireFeedingBedRight_Loose) Victim.DoCombatSpellApply(DiseaseSanguinareVampirisNPC, Victim as ObjectReference) endif if akCaster.PlayIdle(VampireFeedingBedrollLeft_Loose) Victim.DoCombatSpellApply(DiseaseSanguinareVampirisNPC, Victim as ObjectReference) endif if akCaster.PlayIdle(VampireFeedingBedLeft_Loose) Victim.DoCombatSpellApply(DiseaseSanguinareVampirisNPC, Victim as ObjectReference) endif if akCaster.PlayIdleWithTarget(IdleVampireStandingBack, Victim as objectreference) Victim.DoCombatSpellApply(DiseaseSanguinareVampirisNPC, Victim as ObjectReference) endif endif endif endFunction
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)