Модератор форума: 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? Пиши не в ЛС, а в эту тему.
LordVadim  Offline  Сообщение №751 написано: 17 марта 2014, 16:33



139
Цитата DarkVetal

ObjectReference Property prCollision Auto - это в скрипт панели вставить? В какую лучше строку скрипта вставить, чтоб не поломать скрипт? И потом как назначить нужную панель, через Properties или LinkedRef? prCollision.Disable() prCollision.Enable()  - это в скрипт ручек добавить надо, в какую лучше строку скрипта вставить, чтоб не поломать скрипт? И потом как назначить нужную панель, через Properties или LinkedRef? Я нуб в скриптах, поэтому и уточняю

 
У тебя панели поднимаются двумя кнопками. На каждой скрипт, я правильно понимаю?
Если так, то в каждый скрипт, в начале, в разделе объявления свойств, вставляешь:
ObjectReference Property prCollision Auto
И в СК значению prCollision присваиваешь ссылку на плоскость коллизии (в обоих скриптах на одну и туже плоскость).
В скрипт кнопки "опустить", после TranslateToRef вставляешь:
prCollision.Enable()
В скрипт кнопки "поднять", после TranslateToRef вставляешь:
prCollision.Disable() 
Если сам не разберешься - скинь скрипты я посмотрю.

Revil  Offline  Сообщение №752 написано: 19 марта 2014, 14:44


Evil Eye


Заранее спасибо за помощь.
Нужен скрипт, который будет одевать персонажа обратно.
Т.е. Есть триггер, наступая на который нпс раздевается, покидая его он должен одеться обратно. Пока нашла выриант только с disable enable, но это настолько коряво смотрится в игре, что глаза на лоб лезут.
П.С. Рздевающая часть скрипта уже готова.

LordVadim  Offline  Сообщение №753 написано: 19 марта 2014, 20:23



139
Цитата Frei_Engel

П.С. Рздевающая часть скрипта уже готова.


Так покажи её. Чтобы помочь одеть персонажа, надо знать, как он был раздет...  :D

Revil  Offline  Сообщение №754 написано: 20 марта 2014, 08:59


Evil Eye


Вот здесь я его раздеваю:
Event OnTriggerEnter(ObjectReference akActionRef)
          (akActionRef AS Actor).UnEquipAll()
EndEvent

А вот тут я его включаю и выключаю, от чего он, конечно, одевается но его нехило так мограет по локации тудыма сюдыма.

Event OnTriggerLeave (ObjectReference akActionRef)
           If (akActionRef != Game.GetPlayer())
              Utility.Wait(5)
              akActionRef.Disable()
              akActionRef.Enable()
           EndIf
EndEvent

LordVadim  Offline  Сообщение №755 написано: 20 марта 2014, 20:25 | Отредактировано: LordVadim - 20 марта 2014, 20:34



139
Цитата Frei_Engel

А вот тут я его включаю и выключаю, от чего он, конечно, одевается но его нехило так мограет по локации тудыма сюдыма.


Есть три пути решения:
   1) Использовать расширение SKSE для того, чтобы одеть персонажа не используя Disable/Enable. (Некоторые игроки не используют SKSE)
   2) Скрывать персонажа на время операции Disable/Enable и возвращать его потом на место. (НПС моргнет, но мотать по локации его не будет)
   3) Если скриптом раздеваются обычные НПС, то можно их одевать назначая Outfit. (самый простой вариант, но срабатывать будет только на НПС имеющих Outfit)

Какой вариант будем реализовывать?

Revil  Offline  Сообщение №756 написано: 20 марта 2014, 21:38


Evil Eye


LordVadim, Мне нравятся два первых, ибо SKSE я использую и мод делаю для себя, так что его все равно никто никогда не увидит)  Другое дело, что это всего навсего второй скрипт за всю мою жизнь и есть риск, что мне мозгов не хватит разобраться с SKSE. В общем любой из первых двух на ваш выбор, какой удобней и проще вам. smile2

LordVadim  Offline  Сообщение №757 написано: 21 марта 2014, 08:13 | Отредактировано: LordVadim - 21 марта 2014, 08:14



139
Цитата Frei_Engel

В общем любой из первых двух на ваш выбор, какой удобней и проще вам.


Попробуй сначала всё же через Outfit:

Event OnTriggerLeave (ObjectReference akActionRef)
    Actor akActor = akActionRef as Actor
    If (akActor != Game.GetPlayer())
        Utility.Wait(5)
        akActor.SetOutfit(akActor.GetActorBase().GetOutfit())
    EndIf
EndEvent

Если не будет срабатывать, тогда так:

Event OnTriggerLeave (ObjectReference akActionRef)
    Actor akActor = akActionRef as Actor
    If (akActor != Game.GetPlayer())
        Utility.Wait(5)
        Form akItem
        Int akCount = akActor.GetNumItems() ;- Количество вещей в инвентаре
        While akCount > 0
            akCount -= 1
            akItem = akActor.GetNthForm(akCount) ;- Берём вещь под номером akCount
            if akItem.GetType() == 26 ;- Если это "Armor"
                akActor.EquipItem(akItem) ;- Одеваем вещь
            EndIf
        EndWhile
    EndIf
EndEvent

Revil  Offline  Сообщение №758 написано: 21 марта 2014, 08:45 | Отредактировано: Frei_Engel - 21 марта 2014, 09:19


Evil Eye


LordVadim, Спасибо, попробую отчитаюсь. good
____________
Не хочет компилировать.
Первый вариант выдает:
Bathtriggerscript1.psc(12,49): GetOutfit is not a function or does not exist

Второй вариант выдает:
Bathtriggerscript1.psc(13,30): GetNumItems is not a function or does not exist
Bathtriggerscript1.psc(13,12): type mismatch while assigning to a int (cast missing or types unrelated)
Bathtriggerscript1.psc(16,29): GetNthForm is not a function or does not exist
Bathtriggerscript1.psc(17,22): GetType is not a function or does not exist
Bathtriggerscript1.psc(17,32): cannot compare a none to a int (cast missing or types unrelated)

Под спойлером полные скрипты, на случай если нужно посмотреть построчно.

LordVadim  Offline  Сообщение №759 написано: 21 марта 2014, 14:43



139
Цитата Frei_Engel

Не хочет компилировать.

Значит у тебя не установлены скрипты SKSE.
Из архива SKSE взять все содержимое папки SKSE\Data\Scripts
и скопировать с заменой в папку Skyrim\Data\Scripts

Revil  Offline  Сообщение №760 написано: 21 марта 2014, 16:16


Evil Eye


LordVadim, Да есть все специально проверила... кину с заменой авось что получится.

@perture  Offline  Сообщение №761 написано: 21 марта 2014, 16:24 | Отредактировано: @perture - 21 марта 2014, 16:25


$cience innov@tor


Цитата Frei_Engel

Да есть все специально проверила...


Для компиляции нужны исходники скриптов как минимум из Skyrim. Всё на месте?

"Не спорьте с идиотами! Вы опуститесь до их уровня, а там они вас задавят своим опытом!" ©
Revil  Offline  Сообщение №762 написано: 21 марта 2014, 16:32 | Отредактировано: Frei_Engel - 21 марта 2014, 16:33


Evil Eye


@pertureLordVadim, Все заработало. Он заменил 433 файла и внезапно поумнел. Большое спасибо за помощь! Скрипт делает все, что я хотела music

Alliria  Offline  Сообщение №763 написано: 24 марта 2014, 13:12



706
В общем, есть квестовый скрипт, который должен вещшать на мобов абилки в определенном радиусе. Скрипт этот сделан по шаблону, выложенному AlexTirex в этой теме с полгода назад. Квест запускается один раз при первом запуске игры с подключенным модом и не завершается.

Однако эффекта не вижу. Похоже, спеллы просто не назначаются. Лог папируса выдает следующее:
stack:
Собстна, что опять не так? mellow

LordVadim  Offline  Сообщение №764 написано: 24 марта 2014, 19:37



139
Цитата Alliria

Однако эффекта не вижу. Похоже, спеллы просто не назначаются.


1) Ошибки возникают из за того, что функция FindRandomActorFromRef возвращает None (никого не найдено), а скрипт пытается добавить Spell.
2) На ком это должно срабатывать? В таком виде скрипт даже кроликам будет пытаться добавлять Spell. Можно сделать проверку GetRace() и FormList HeadPartsAllRacesMinusBeast.
3) Код скрипта не эффективен. Если хотите могу подправить, но напишите подробно условия срабатывания.

AleksTirex  Offline  Сообщение №765 написано: 24 марта 2014, 19:38


Архимаг


371
Цитата Alliria

Однако эффекта не вижу. Похоже, спеллы просто не назначаются. Лог папируса выдает следующее:



Если компилятор выдаёт ошибки, то это значит, что скрипт не скомпилирован и работать не будет. Поэтому и эффекта не видно.
 
Возможно, компилятору не нравится сам массив. Тогда просто введи временную переменную Actor  и назначай на неё актёра из массива, потом работай с этой переменной, а не с массивом. Тогда компилятор будет видеть "чистого актёра", и возможно, он перестанет кочевряжиться.
Попробуй такой вариант:
 



 
Радиус поиска 30000 - это слишком много, т.к. загружаются в игру максимум 3 ячейки от ГГ (1 ячейка == 4098), в интерьерах так вообще будут видны и обрабатываться все имеющиеся там НПС, хоть и находятся они "в трёх днях пути".
А так же в скрипте нет проверки на "что это за актёр", т.е. скрипт без этого будет вешать абилки и на крабов, и на драугов и на всё движущееся и шевелящееся, а оно надо? (достаточно проверки наличия кейворда ActorTypeNPC).

Alliria  Offline  Сообщение №766 написано: 25 марта 2014, 00:27



706
AleksTirex, скрипт из моего поста компиллятор компиллирует. Тот лог - это лог, который Папирус ведет в игре (Documents/My Games/Skyrim/Logs/Script/Papyrus0.log)
Твой новый вариант - не компиллирует. Вот лог компиллятора:

LordVadim, так проблема в том, почему возвращается none или temp13 в ячейках, заполненных актерами.

По условиям срабатывания и типу актеров:
aaARCRabilityUndead - выдается всей нежити, включая вампиров и дохлых драконов (условия прописаны в самом спелле);
aaARCRabilityUndeadMod - выдается актерам, имеющим фракцию _00SICUndeadFaction;
aaARCRabilityWeapArmMatSpecDrag (она пока "пустая") и aaARCRWeapArmMatSpecBase - выдаются всем гуманоидам.

LordVadim  Offline  Сообщение №767 написано: 25 марта 2014, 17:35 | Отредактировано: LordVadim - 25 марта 2014, 18:21



139
Цитата Alliria

LordVadim, так проблема в том, почему возвращается none или temp13 в ячейках, заполненных актерами.


Не стал разбираться почему не срабатывает скрипт. Приведу свой вариант:

В скрипт не включил проверки на ком срабатывать, я так понял, что они прописаны в условиях спеллов. Кстати, если спеллы не срабатывают - проверь правильность написания этих условий.

DarkVetal  Сообщение №768 написано: 25 марта 2014, 18:47

Уважаемые скриптеры, срочно нужна ваша помощь! Проблема вот в чём: у меня деревья не ЛОДятся. Я хочу вручную расставить ЛОД-модели деревьев внутри обычных, отметить галочкой IsFullLod. Нужен скрипт, который делает так, чтобы на близких расстояниях этих  ЛОД-деревьев не было видно, а на расстоянии появления лодов они включались. Если возможно, учитываться должен параметр UGridsToLoad (подгружаемые ячейки), так как некоторые игроки могут изменить этот параметр, и лоды деревьев могут перемежаться с обычными деревьями. Варианты типа пересоздай ЛОДы не прокатят. Я уже сделал всё что мог с лодами, остался только этот параметр. Большое спасибо всем, кто откликнеться.

LordVadim  Offline  Сообщение №769 написано: 25 марта 2014, 19:27 | Отредактировано: LordVadim - 25 марта 2014, 20:06



139
Цитата DarkVetal

Уважаемые скриптеры, срочно нужна ваша помощь! Проблема вот в чём: у меня деревья не ЛОДятся. Я хочу вручную расставить ЛОД-модели деревьев внутри обычных, отметить галочкой IsFullLod. Нужен скрипт, который делает так, чтобы на близких расстояниях этих  ЛОД-деревьев не было видно, а на расстоянии появления лодов они включались. Если возможно, учитываться должен параметр UGridsToLoad (подгружаемые ячейки), так как некоторые игроки могут изменить этот параметр, и лоды деревьев могут перемежаться с обычными деревьями. Варианты типа пересоздай ЛОДы не прокатят. Я уже сделал всё что мог с лодами, остался только этот параметр. Большое спасибо всем, кто откликнеться.


Как привязать к  UGridsToLoad - не знаю. Все, что могу предложить - скрипт для скрытия/отображения дерева:

ScriptName LodTreeOnOffSCRIPT extends ObjectReference ;- Скрипт на статическом объекте

Event OnInit()
    RegisterForUpdate(5)
 ;- Включаем процедуру обновления 1 раз в 5 секунд
EndEvent

Event OnUpdate()
 ;- Процедура обновления
    if GetLinkedRef().GetDistance(Game.GetPlayer()) > 30000 ;- Если расстояние до ГГ > 30000 (значение подобрать опытным путём)
        GetLinkedRef().Enable() ;- Показываем дерево
    else
        GetLinkedRef().Disable()
 ;- Скрываем дерево
    EndIf
EndEvent


Скрипт на любой статический объект рядом с деревом. Дерево привязать к объекту через LinkedRef в СК.
Если надо скрывать/отображать несколько стоящих рядом деревьев, то остальные привязываются к главному дереву, через Enable Parent в СК.

DarkVetal  Сообщение №770 написано: 25 марта 2014, 20:03

LordVadim, при компиляции выдает такую ошибку:
required (...)+ loop did not match anything at input ')
Случайно не знаеш,  в чём может быть проблема?

LordVadim  Offline  Сообщение №771 написано: 25 марта 2014, 20:06



139
Цитата DarkVetal

LordVadim, при компиляции выдает такую ошибку: required (...)+ loop did not match anything at input ') Случайно не знаеш,  в чём может быть проблема?


Моя ошибка - лишняя скобка после 30000.

DarkVetal  Сообщение №772 написано: 25 марта 2014, 20:39

LordVadim, спасибо большущее, всё работает как часы. Интересная особенность игры: если выходить из ячейки, то предметы долго ещё не исчезают из поля зрения, а если заходить в нее, то появляются перед самым носом. Выбрал среднее значение - 8000.

Temka_T_34  Offline  Сообщение №773 написано: 26 марта 2014, 06:22



22
Какой нужет скрипт чтобы изменять внешность????? Бесплатно в доме

LordVadim  Offline  Сообщение №774 написано: 26 марта 2014, 06:31



139
Цитата Temka_T_34

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


Открываешь консоль, пишешь showracemenu и меняешь внешность как тебе захочется.  :D

Alliria  Offline  Сообщение №775 написано: 26 марта 2014, 11:44 | Отредактировано: Alliria - 26 марта 2014, 11:45



706
LordVadim, сделала, как ты сказал: скомпиллировала твой скрипт, создала форм-лист, прописала его в свойствах скрипта, убрала условия из раздаваемого закла aaARCRabilityUndead (т.е. теперь он должен работать вообще на всех).
То же самое, эффекта на нпс не вижу. Папирус в игровом логе пишет то же:
Может еще что-то надо дописать?

LordVadim  Offline  Сообщение №776 написано: 26 марта 2014, 11:51



139
Цитата Alliria

Может еще что-то надо дописать?


Сейчас времени нет. Вечером себе в СК скрипт запихну и посмотрю в чем проблема...

Alliria  Offline  Сообщение №777 написано: 26 марта 2014, 12:00



706
LordVadim, ну мне не к спеху.

Quazar  Offline  Сообщение №778 написано: 26 марта 2014, 14:58



446
Подскажите какую команду можно использовать чтобы заблокировать контейнер в событии OnActivate, т.е. чтобы меню контейнера не открывалось вовсе? Return не работает в этом событии, BlockActivation() тоже.

LordVadim  Offline  Сообщение №779 написано: 27 марта 2014, 12:28 | Отредактировано: LordVadim - 27 марта 2014, 12:39



139
Цитата Alliria

LordVadim, ну мне не к спеху.


Пришлось кое что переделать, но у меня заработало. Подробности под спойлером:



MemoriaVetusta  Offline  Сообщение №780 написано: 27 марта 2014, 15:43



173
Нужно оптимизировать скрипт, убрав событие "EVENT OnEffectStart":



Без "EVENT OnEffectStart" отказывается работать (по-моему, даже не компилируется). И еще: если актер погибает под добиванием в ближнем бою, событие не активируется. Нужно это обойти.
Скрипт взят с атронаха. Заранее спасибо.

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





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