Модератор форума: 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? Пиши не в ЛС, а в эту тему.
Иероним  Offline  Сообщение №691 написано: 25 января 2014, 12:32



770
AleksTirex, всё! Получилось то что нужно. Всё компилируется, а главное работает. Теперь уже буду сам эксперименты ставить на триггерах и активаторах. Спасибо большое за помощь.  good

Добавлено (25 Января 2014, 16:32)
---------------------------------------------
И теперь вопрос немного другого плана. Звуки, можно их вешать на триггеры или активаторы?


AleksTirex  Offline  Сообщение №692 написано: 25 января 2014, 12:53


Архимаг


371
Цитата Иероним

Звуки, можно их вешать на триггеры или активаторы?



http://www.creationkit.com/Play_-_Sound

LordVadim  Offline  Сообщение №693 написано: 26 января 2014, 07:34 | Отредактировано: LordVadim - 26 января 2014, 08:36



139
Цитата Иероним

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

Вот об этом я и писал - нужно точно определиться, что ты хочешь сделать...
Если нужно, что бы НПС был создан один раз, зачем заморочки со сложными скриптами?
В СК создаешь в нужном месте НПС скрытым по умолчанию (отмечено Initially Disabled).
Триггер или активатор связываешь с НПС через Linked Ref.
На триггер или активатор вешаешь скрипт:

Scriptname TriggerActivatorToEnableActorScript extends ObjectReference

Event OnActivate(ObjectReference akActionRef)         ;- Произошло событие - активирован активатор
    if akActionRef == Game.GetPlayer()                         ;- Если событие вызвано игроком
        Self.GetLinkedRef().Enable()                                ;- Связанного с активатором НПС делаем видимым
    endif
endEvent

Event OnTriggerEnter(ObjectReference akActionRef)  ;- Произошло событие - вход в зону триггера
    if akActionRef == Game.GetPlayer()                         ;- Если в зону триггера вошел игрок
        Self.GetLinkedRef().Enable()                                ;- Связанного с триггером НПС делаем видимым
    endif
endEvent

mxac  Offline  Сообщение №694 написано: 27 января 2014, 21:54



178
Ребята, подскажите скрипт в котором при выбросе предмета из инвертаря он исчезал а на его месте появлялся активатор, а то всё не разберусь с Event OnItemRemoved...


Myprism  Offline  Сообщение №695 написано: 28 января 2014, 04:41


Физик


Цитата mxac

подскажите скрипт в котором при выбросе предмета из инвертаря он исчезал а на его месте появлялся активатор

Что-то тут не то в принципе. Если предмет уже в инвентаре, значит, игрок может взаимодействовать с ним в игре и активатор ему не нужен. Обычно активаторы используют в обратной ситуации - когда надо взять предмет, который не берётся. Например, висит в игре в воздухе Древний Свиток. Никакой предмет в игре висеть не может, упадёт. Так подвесили статик, который висеть может, а вот брать его нельзя. Тогда поверх него поставили активатор. Игрок думает, что взаимодействует со свитком, а на самом деле - с активатором. После взаимодействия с активатором скрипт удаляет статик, удаляет сам активатор и добавляет в инвентарь игроку уже нормальный Свиток. Игрок думает, что взял висевший в воздухе Свиток.

Мостик  Offline  Сообщение №696 написано: 29 января 2014, 16:34 | Отредактировано: Мостик - 29 января 2014, 16:34


Ученик


204
AleksTirex, либо же просто можно после появления скелета, удалить сам триггер)

Добавлено (29 Января 2014, 20:34)
---------------------------------------------
Цитата Aksyonov

Спасибо, как видите я с редактором creation Kit не слишком хорошо знаком, и думал что сделать то о чем спросил можно только при помощи скриптов, тем более что нужно сделать следующие, у нас есть дерево, к нему подходит давакин нажимает и проигрывается анимация если есть топор в инвентаре, давакин начинает рубить дерево, активное дерево Enable удаляется - и судя по вашим словам переключается в ползунок Disable а другое дерево на этом же месте появляется, в нашем случае это обычный пенек, но тогда в моде будет необходимо добавить туда где находится дерево миллионы пеньков? я думаю без скрипта все же не обойтись ? как считаете ?


Aksyonov
, для рубки дерева нет анимации... Только для рубки дров на пне, а она врят ли вам подойдет ...
+ дерево нужно будет создавать как Static, а еще лучше как активатор.

И Совершенно верно!!! Тут нужен скрипт который во первых, вызовет анимацию. Во вторых уберет или удалит ваше дерево а активирует ваш пень.
Скрипт не сложный.

Выглядит примерно так.

Код
ScriptName TreeScript extends ObjectReference

ObjectReference Property Tree auto ; Ваше дерево
ObjectReference Property Shrub auto ; Ваш пень

Event OnActivate(ObjectReference akActionRef)
Shrub.Enable() ; Добавляем пень.
Tree.Disable() ; Убираем дерево. Либо можно его удалить методом Tree.Delete()
EndEvent

Aksyonov  Offline  Сообщение №697 написано: 29 января 2014, 17:02



937
Цитата Мостик

ScriptName TreeScript extends ObjectReference ObjectReference Property Tree auto ; Ваше дерево
ObjectReference Property Shrub auto ; Ваш пень

Event OnActivate(ObjectReference akActionRef)
Shrub.Enable() ; Добавляем пень.
Tree.Disable() ; Убираем дерево. Либо можно его удалить методом Tree.Delete()
EndEvent

Спасибо очень сильно мне помогли, попробую.

Мостик  Offline  Сообщение №698 написано: 29 января 2014, 17:19


Ученик


204
Aksyonov, Всегда пожалуйста. Обращайтесь)

Да и кстати... Видел вас интересует анимация в скайриме. Вот почитайте это.
http://wiki.tesnexus.com/index.php/Working_with_animations_in_Skyrim

Aksyonov  Offline  Сообщение №699 написано: 30 января 2014, 02:03



937
Цитата Мостик

Да и кстати... Видел вас интересует анимация в скайриме. Вот почитайте это.

Да очень интересует, но то о чем говорится в статье я уже делать научился, анимацию добавлять теперь умею, другое дело как там создать свой собственный скелет, сейчас приходится открывать какой нибудь скелет из игры и делать анимацию для него, а вот как создать свой собственный скелет я пока не знаю, но хочу научится, пока ещё не понимаю зачем в игру два файла skeleton.nif это то сама модель с костями а вот skeleton.hkx зачем? ограничение костей? ведь hkx по идеи должен содержать анимацию а для статичного скелета какая там анимация может быть, видимо просто прописаны ограничение движение костей.

Greez  Offline  Сообщение №700 написано: 30 января 2014, 19:21 | Отредактировано: Greez - 30 января 2014, 19:22



20
подскажите, можно ли как то скриптами заставить непися (например корову или курицу) остановиться и не двигаться некоторое время, секунд на 10 ?
что то вроде дизэйблАИ, только что бы совсем отрубалось ее АИ и главное ноги, а не только способность замечать ГГ

перк взаимодействия с объектом я уже сделал, но хочу добавить 10 секундную анимацию. будет очень глупо выглядеть если в это время корова пойдет дальше гулять по своим коровьим делам :)

LordVadim  Offline  Сообщение №701 написано: 30 января 2014, 19:55 | Отредактировано: LordVadim - 30 января 2014, 19:58



139
Цитата Greez

подскажите, можно ли как то скриптами заставить непися (например корову или курицу) остановиться и не двигаться некоторое время, секунд на 10 ? что то вроде дизэйблАИ, только что бы совсем отрубалось ее АИ и главное ноги, а не только способность замечать ГГ

Можно. На НПС вешается скрипт:

Scriptname StopAIActorScript extends Actor

Event OnActivate(ObjectReference akActionRef)         ;- Событие активации НПС
    if akActionRef == Game.GetPlayer()                         ;- Если активировал игрок
        Self.EnableAI(False)                                             ;- Отключаем AI
        Debug.Wait(10)                                                   ;- Ждем 10 секунд
        Self.EnableAI(True)                                              ;- Включаем AI
    endif
endEvent

Greez  Offline  Сообщение №702 написано: 2 февраля 2014, 08:18



20
LordVadim
спасибо за ответ. до этого я не совсем корректно использовал  EnableAI(False) и у меня животные продолжали ходить, поэтому и стал искать альтернативу. но вроде все получилось.

я чуть раньше еще один вопрос про снег задавал, который к моему великому сожалению остался без ответа. :)  может кто нибудь все таки подскажет как выйти из положения.
Есть задача. Задетектить скриптом, что ГГ в данный момент стоит на снегу или в воде или на камнях (не суть важно, мне главное понять механику)

Как я понимаю проверить это можно, создав некий маг. эффект, например ауру на ГГ и совместив это с ImpactDataSet провести проверку на столкновения ауры с поверхностью и понять какой там прописан материал. материал вода и снег там есть. т.е. по логике можно понять что ГГ сейчас на снегу или в воде. Или не ауру, а какой нибудь предмет ронять, проверить на столкновение и удалять его. Я других способов что то не вижу.
На ВиКи как то очень бедненько все расписано и мне банально не хватает понимания как этим манипулировать.
Был бы очень признателен, если бы кто то либо объяснил эту механику или помог найти туториал по этой теме.

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

LordVadim  Offline  Сообщение №703 написано: 2 февраля 2014, 11:14



139
Цитата Greez

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

Я пишу, только о том - о чем знаю. Тема затронутая в вопросе мне не знакома.
Проси помощи у AleksTirex, он намного лучше меня разбирается в скриптах.

mxac  Offline  Сообщение №704 написано: 6 февраля 2014, 07:55



178
Народ, можно ли скриптом через маг эффект выбросить в мир объект к примеру под ноги персонажу? Или ещё каким похожим способом который можно прикрутить к еде...


Greez  Offline  Сообщение №705 написано: 6 февраля 2014, 08:07



20
Цитата mxac

Народ, можно ли скриптом через маг эффект выбросить в мир объект к примеру под ноги персонажу? Или ещё каким похожим способом который можно прикрутить к еде...



Game.GetPlayer().DropObject(какой то объект, кол-во)

VIPerMX  Offline  Сообщение №706 написано: 6 февраля 2014, 21:26



173
Подскажите пожалуйста решение. Мне надо запустить event когда предмет (objectreference) появляется (enable) как это можно сделать?!

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

Как-то криво написано, но я надеюсь мысль понятна?!

LordVadim  Offline  Сообщение №707 написано: 7 февраля 2014, 08:49



139
Цитата VIPerMX

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


А не проще было бы на триггер повесить еще один скрипт в котором и делать проверки?

VIPerMX  Offline  Сообщение №708 написано: 7 февраля 2014, 10:02 | Отредактировано: VIPerMX - 7 февраля 2014, 10:05



173
Цитата LordVadim

А не проще было бы на триггер повесить еще один скрипт в котором и делать проверки?


Было бы, но там небольшая загвоздка, обьект включается (там очень сложный скрипт и двойной тригер) после выхода из тригера с небольшой задержкой, которую сложно рассчитать. Т.е. тригер включает обьект, и надо его сразу отключить по проверке.
Можно попробовать поставить утилити вэйт (или как там таймер был), рассчитать до появления обьекта и отключить его. Но самое было б замечательное старт евента при появлении обьекта, но такой функции в скриптах нет!

LordVadim  Offline  Сообщение №709 написано: 7 февраля 2014, 11:59 | Отредактировано: LordVadim - 7 февраля 2014, 12:00



139
Цитата VIPerMX

Но самое было б замечательное старт евента при появлении обьекта, но такой функции в скриптах нет!


Правильным решением было бы все таки изменить скрипт на триггере.
Если этого не делать, то единственным решением, на мой взгляд, будет следующее:

Scriptname VerificationSCRIPT extends ObjectReference    ;- Дополнительный скрипт на триггере

Event OnActivate(ObjectReference TriggerRef)                   ;- Событие активации триггера
    RegisterForUpdate(0.1)                                                   ;- Включаем вызов процедуры OnUpdate() 10 раз в секунду
    Utility.Wait(10)                                                                ;- Задержка (время задержки установить чуть больше чем необходимо для срабатывания основного скрипта триггера)
    UnregisterForUpdate()                                                    ;- Отключаем вызов процедуры OnUpdate()
EndEvent

Event OnUpdate()                                                               ;- Событие вызывается 10 раз в секунду
    ;-
    ;- Здесь проводить необходимые проверки объектов (функции IsDisabled()  IsEnabled() )
    ;-
EndEvent

VIPerMX  Offline  Сообщение №710 написано: 7 февраля 2014, 14:18



173
Цитата LordVadim

Правильным решением было бы все таки изменить скрипт на триггере.Если этого не делать, то единственным решением, на мой взгляд, будет следующее:

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

А зачем вы использовали евент он апдейт?! Не проще ли будет event onTriggerLeave потом utility.wait а дальше оператор ветвления на проверку?

LordVadim  Offline  Сообщение №711 написано: 7 февраля 2014, 19:58



139
Цитата VIPerMX

А зачем вы использовали евент он апдейт?! Не проще ли будет event onTriggerLeave потом utility.wait а дальше оператор ветвления на проверку?


Ты же сам сказал, что не можешь точно рассчитать время которое нужно поставить в Wait().
Если поставить слишком короткую задержку - проверки могут пройти до окончания работы основного скрипта.
Если слишком длинную -  объекты будут "моргать" на экране, то есть появляться на какое то время, а затем исчезать.
А через OnUpdate() состояние объектов проверяется 10 раз в секунду (можно и чаще).
То есть как только состояние изменилось выполняются твои проверки и объект или скрывается или остается видимым.
Пользователь, практически, не заметит появления ("моргания") объекта на экране если он должен быть скрыт.

VIPerMX  Offline  Сообщение №712 написано: 7 февраля 2014, 20:09 | Отредактировано: VIPerMX - 7 февраля 2014, 20:09



173
Цитата LordVadim

Скинь мне я посмотрю.


Это код из модификации Lightning Just in Time. Он очень хитрий и я решил не трогать его а добавить свой скрипт.

А за остальное спасибо, я попробую!

LordVadim  Offline  Сообщение №713 написано: 7 февраля 2014, 21:22



139
Цитата VIPerMX

Это код из модификации Lightning Just in Time. Он очень хитрий и я решил не трогать его а добавить свой скрипт.


Ничего особо хитрого я тут не увидел. Все изменения видимости объектов происходят в событии OnUpdate().
Тебе, всего лишь, в конец этого события (перед  EndEvent) надо вставить свои проверки и изменять видимость объектов как тебе нужно... и всё.  :)

VIPerMX  Offline  Сообщение №714 написано: 8 февраля 2014, 09:39



173
Цитата LordVadim

Ничего особо хитрого я тут не увидел

Спасибо большое за помощь. Я все же попробую вариант без влезания в чужой скрипт.

TrueError  Offline  Сообщение №715 написано: 10 февраля 2014, 12:03



4
Господа, всем привет. Модостроением в скайриме занялся совсем недавно, и на данный момент с другом клепаем серию квестов связанных с очень "оригинальной" тематикой вампиров  :D
у меня появилось два вопроса:

1) По умолчанию шанс получить болезнь "сангвинаре вампирис" 10%. Как сделать скрипт, чтобы персонаж после выпитого зелья гарантированно получал "сангвинаре" вне зависимости от его резистов к болезням и т.д. (выпил - получил)

2) Возможно ли сделать скрипт, позволяющий каждую игровую ночь в случайном порядке генерить n-ое количество неписей в рандомных местах скайрима. Прошу прощения если выразился не совсем удачно, в общем суть приблизительно такая: После выполнения определенного квеста на игрока начинает охоту некая группа "охотников на вампиров". Как реализовать возможность, чтобы каждую ночь у игрока был шанс натолкнутся на такую группу в рандомном количестве 2-4 участника в любом месте карты, кроме помещений.

Жду ваших советов или указаний. Заранее спасибо  ;)

AleksTirex  Offline  Сообщение №716 написано: 10 февраля 2014, 19:18


Архимаг


371
Цитата VIPerMX

Это код из модификации Lightning Just in Time. Он очень хитрий и я решил не трогать его а добавить свой скрипт.



Если правильно понял, то надо не включать объект при каких-то условиях. И этот объект один из light_1...light_3 и т.д? Если это так, и очень не хочется вмешиваться/изменять тот скрипт, то можно просто в том скрипте удалять (стирать) ссылку на свой объект если включать нельзя, и потом опять её добавлять, когда включать/управлять можно.

Например, твой объект light_3, тогда на него повесь скрипт:
 
ObjectReference Property akObject Auto
 
Function OnOff()
  if ; условие запрета включения объекта light_3
    (akObject as LightingBall).light_3 = none
  else
    (akObject as LightingBall).light_3 = self as ObjectReference
  endif
endFunction


akObject - это объект, на котором висит основной скрипт,
LightingBall - название того скрипта.
 
В любой функции или событии запускается команда на эту функцию OnOff(), или при загрузки локации, или по какому-то триггеру (но до срабатывания основного триггера того скрипта), или ещё как. Там в зависимости от условий, можно включаться или нет, стирается или восстанавливается ссылка на свой объект.
 
Если нет ссылки на объект, то его и выключить нельзя, просто нечего выключать.

*************
 
Можно и на другой объект повесить такой скрипт, тогда вместо self передавать назначенное свойство на свой объект.
Это сам принцип, дальше уже придумаете что и как.

TrueError  Offline  Сообщение №717 написано: 11 февраля 2014, 14:49 | Отредактировано: TrueError - 11 февраля 2014, 14:50



4
Кто-нибудь знает как увеличить время нахождения в шкуре оборотня? Вроде за это отвечает скрипт PlayerWerewolfChangeScript, но что-то я в нем совсем запутался.

Добавлено (11 Февраля 2014, 18:49)
---------------------------------------------
Шел по хлебным крошкам, но нашел как регулировать время в шкуре оборотня. Если кому интересно, заглядываем под спойлер ;)


p1cador  Offline  Сообщение №718 написано: 13 февраля 2014, 10:28 | Отредактировано: p1cador - 14 февраля 2014, 18:33



2
Добрый день. Помогите пожалуйста новичку в скриптописании.

Хочу написать скрипт, который немного меняет параметры игрока при убийстве им других персонажей. И что-то никак не могу найти подходящее событие. Т.е. ищу что-то вроде OnDeath, только наоборот - чтобы происходило не когда персонажа убивают, а когда он убивает кого-то. Можно конечно скрипт с OnDeath засунуть во всех возможных Actor'ов,  но это:
1) Долго.
2) Могу пропустить кого-нибудь.
3) Да и вообще некрасиво.

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

Update: Подумал, что похожий скрипт должен висеть на Эбонитовом клинке - ибо друзей всяких много может быть, а на каждом не висит скрипт на OnDeath. Раскопал, что появляется отдельное скрытое задание на убийство товарищей. В скрипте этого задания тупо запускается функция с названием вроде friendkilled(), которая увеличивает кол-во убитых друзей на 1 и проверяет, четное ли число друзей мы убили, и если да - запускает сценку с Мефалой. А вот как определяется, что мы вообще кого-то убили, и был ли другом тот, кого мы убили - нигде нет. Уже вроде все перелопалил:(

Update2: Спасибо за помощь, но я уже разобрался.

Arin  Offline  Сообщение №719 написано: 13 февраля 2014, 16:21 | Отредактировано: Arin - 13 февраля 2014, 16:29



570
Доброго времени суток.
Не могли бы вы помочь со скриптом? Мне нужен скрипт, при котором между игроком и нпс начинается поединок, при этом
- или нпс не наносить никакого урона (и магией тоже, или магия блокируется).
- или стоит со щитом и просто блокирует удары.
Мне этот скрипт нужен для создания тренера, который учит не только с помощью окно, но и проводит настоящие тренировочные поединки.

Наука всегда оказывается не права. Она не в состоянии решить ни одного вопроса, не поставив при этом десятка новых.
Джордж Бернард Шоу
Artem13  Offline  Сообщение №720 написано: 14 февраля 2014, 05:10


Mercenaries. Со смертью на ты.


Arin, а посмотри Вилкаса. Там, ведь, при поступлении к Соратникам, по сути, как раз тренировочный поединок.

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Поиск:





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