Модератор форума: 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  Сообщение №1021 написано: 22 апреля 2014, 18:03 | Отредактировано: LordVadim - 22 апреля 2014, 18:10



139
Цитата nepewka

Посмотрите пожалуйста, что не так?


GlobalVariable Property AAAbegemot auto
Static Property XMarker auto
Spell Property AAAptaxa auto

Event OnEffectStart(Actor akTarget, Actor akCaster)
    if AAAbegemot.GetValue() == 0.0
        AAAbegemot.SetValue(1.0)
        ObjectReference akMarker = akTarget.PlaceAtMe(XMarker)
        ObjectReference akMarker2 = akTarget.PlaceAtMe(XMarker)
        ObjectReference akMarker3 = akTarget.PlaceAtMe(XMarker)
        int akCount = 4
        While akCount > 0
            akCount -= 1
            Utility.Wait(5.0)
            AAAptaxa.Cast(akMarker, akTarget)
            AAAptaxa.Cast(akMarker2, akTarget)
            AAAptaxa.Cast(akMarker3, akTarget)
        endWhile
        akMarker.DisableNoWait()
        akMarker.Delete()
        akMarker2.DisableNoWait()
        akMarker2.Delete()
        akMarker3.DisableNoWait()
        akMarker3.Delete()
        Utility.Wait(180.0)
        AAAbegemot.SetValue(0.0)
    endif
EndEvent

nepewka  Offline  Сообщение №1022 написано: 22 апреля 2014, 18:17



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

serdj_st  Offline  Сообщение №1023 написано: 24 апреля 2014, 13:08



23
Здравствуйте!
Как в скрипте воспроизвести аналог condidion function: WornApparelHasKeywordCount или GetKeywordItemCount?

Raser0919  Offline  Сообщение №1024 написано: 25 апреля 2014, 16:38 | Отредактировано: Raser0919 - 25 апреля 2014, 16:38



409
Никто не знает с помощью какой команды можно реализовать плавный поворот игрока? Пояснение - команда TranslateTo() не помогает.

LordVadim  Offline  Сообщение №1025 написано: 25 апреля 2014, 18:20



139
Цитата Raser0919

Никто не знает с помощью какой команды можно реализовать плавный поворот игрока? Пояснение - команда TranslateTo() не помогает.


Попробуй SetAngle() в цикле, с небольшими задержками.

Raser0919  Offline  Сообщение №1026 написано: 25 апреля 2014, 18:37



409
Цитата LordVadim

Попробуй SetAngle() в цикле, с небольшими задержками.

Увы этот способ наиболее ресурсоемкий(((

nepewka  Offline  Сообщение №1027 написано: 27 апреля 2014, 19:35 | Отредактировано: nepewka - 27 апреля 2014, 19:35



255
Можно ли на подобии как в Morrowind реализовать "активируемые" итемы, которые работают как спеллы?
А то тут только либо постоянный эффект на себя, если броня, либо эффект при ударе, если оружие. А активируемых вещей, как в морровинде, либо на себя, либо на цель, как спелл - даже и не видел..

anton  Offline  Сообщение №1028 написано: 7 мая 2014, 19:03



362
Кто ни будь писал скрипты для Перков ?
А то поле для скрипта есть, но ни одного события, на которое можно подцепить скрипт, у Перка нет :(

Мой Блог
AleksTirex  Offline  Сообщение №1029 написано: 7 мая 2014, 22:44


Архимаг


371
anton, у перка есть только одно событие - это срабатывание самого перка (это точно так же, как в топиках, сценах и стадиях квеста). В скрипте перка пишутся команды прямо в теле, без всяких функций и событий.
Это событие возникает при активации чего-либо носителем перка, т.е. когда хозяин перка что-то активирует (естественно, если активация удовлетворяет условиям перка).
 
Это очень удобно для отслеживания действий ГГ - что он трогает/берёт/нажимает и т.д. Т.к. при этом не надо вешать на все потенциальные предметы свои скрипты, достаточно одного в перке.

anton  Offline  Сообщение №1030 написано: 8 мая 2014, 15:56 | Отредактировано: anton - 8 мая 2014, 16:10



362
AleksTirex, спасибо. Дело в том, что я так и предположил, написал простенький вывод сообщения в скрипте, а компилятор меня отругал.
Но сейчас попробовал снова, и ошибок уже не было. Чудеса, очередной раз подтверждающие, что ночью надо спать, а не коды писать ! :)

Нет, всё таки это сейчас я ошибся - не компилируется скрипт ! :(
Вот как он выглядит:
Код
Scriptname _Anton_ADW_GlidingPerk extends Perk

Debug.Notification("Current movement speed: " + Game.GetPlayer().GetAnimationVariableFloat("Speed"))

PS:Компилирую в Notepad++

Мой Блог
AleksTirex  Offline  Сообщение №1031 написано: 8 мая 2014, 19:11 | Отредактировано: AleksTirex - 8 мая 2014, 20:11


Архимаг


371
Цитата anton

;BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment

;NEXT FRAGMENT INDEX 18

Scriptname _Anton_ADW_GlidingPerk Extends Perk Hidden

;BEGIN FRAGMENT Fragment_0

Function Fragment_0(ObjectReference akTargetRef, Actor akActor)

;BEGIN CODE

Debug.Notification("Current movement speed " + Game.GetPlayer().GetAnimationVariableFloat("Speed"))

Debug.Notification("на ком висит данный перк == " + akActor)

Debug.Notification("кого/что активировал хозяин перка == " + akTargetRef)

;END CODE

EndFunction

;END FRAGMENT

;END

;END FRAGMENT CODE - Do not edit anything between this and the begin comment



А должно быть так.  Разницу заметил?  ;)

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

*******
В данном типе скриптов точки с запятой ";" не работают как в обычных скриптах, и всё то, что после них тоже скрипту необходимо, он этим пользуется. Поэтому там ничего нельзя менять и удалять (!).
*******
Добавлять кнопкой Add такие скрипты нельзя, их надо создавать: в окне для кода ставишь точку с запятой ";" и компилируешь, закрываешь объект, опять открываешь и желательно переименовать на своё название/ID (кнопка Rename), закрываешь,опять открываешь свой перк/топик/сцену и т.д. и уже можешь писать команды и назначать свойства (если свойства назначить раньше,то они потеряются).
Иначе скрипт не "привяжется" к объекту.

anton  Offline  Сообщение №1032 написано: 8 мая 2014, 20:09



362
AleksTirex, точно, я не нашёл в игре ни одного перкового скрипта, в котором не использовались бы фрагменты.

Но в окошке перка скрипт не пишется, только через кнопку <добавить>. (при этом сам скрипт компилируется без ошибок)
В квестах я такие скрипты делал (для стадий квеста), там именно в самом окошке он пишется и компилируется, и всё работает.
Но добавляя такой "фрагментный" скрипт в Перк, я в игре ничего не получаю. Бегаю, хватаюсь за всякие вещи, но сообщений нету. :(

Вот окошко, куда я скрипт пристраиваю:

Мой Блог
AleksTirex  Offline  Сообщение №1033 написано: 8 мая 2014, 20:36


Архимаг


371
Цитата AleksTirex

Добавлять кнопкой Add такие скрипты нельзя, их надо создавать: в окне для кода ставишь точку с запятой ";" и компилируешь, закрываешь объект, опять открываешь и желательно переименовать на своё название/ID (кнопка Rename), закрываешь,опять открываешь свой перк/топик/сцену и т.д. и уже можешь писать команды и назначать свойства (если свойства назначить раньше,то они потеряются).
  Иначе скрипт не "привяжется" к объекту.

Добавлено (09 Мая 2014, 00:36)
---------------------------------------------
anton, facepalm я сослепу и не заметил, что ты пытаешься повесить скрипт на "обычный" Entry Point, а скрипты в перке можно вешать только на Entry Point Activate. На других типах перков скрипт по определению не сможет работать, ведь события то они не "хавают", так и самой возможности работы такого скрипта попросту нет, не говоря уже об остальном. :)


anton  Offline  Сообщение №1034 написано: 8 мая 2014, 20:56



362
AleksTirex, я еле допёр как оно должно работать !!! facepalm

Когда ты написал, что я не там скрипт вставляю и про Entry Point = Activate я всё понял !
И всё это время я пытался скомпилировать тот фрагмент. И несмотря ни на что, он таки скомпилировался.
(там нельзя было обычным копи-пастом делать, там оказыватся копипастить надо только внутренность функции)

Но ...... всё равно ничего в игре не пишется :(
Продолжу завтра, может условия другие поставлю...

Вот, что у меня пока получилось:

Мой Блог
AleksTirex  Offline  Сообщение №1035 написано: 8 мая 2014, 21:29


Архимаг


371
anton, судя по всему, ты хотел сделать условия "если надеты крылья"?
Тогда замени HasKeyword на WornHasKeyword. Это будет == "Если на ГГ надета шмотка с кейвордом крыльев". (иначе ты проверял "есть ли у ГГ такой кейворд", а откуда же он возьмётся у самого ГГ?)

anton  Offline  Сообщение №1036 написано: 9 мая 2014, 07:01 | Отредактировано: anton - 9 мая 2014, 07:05



362
AleksTirex, Ррр, тем кто придумал такой способ добавления скрипта в Перк надо руки по отрывать, по самую шею ! :(

Я в общем потратил более пяти часов !!! только на то, чтобы добиться работоспособности этого простенького скрипта facepalm
(час потратил только на то, чтобы догадаться не копировать в то окошко весь скрипт, а только три строчки самой функции)

Если не делать точь в точь как ты написал, скрипт не привязывается.
(при этом ошибок не пишет, чудесно компилируется, просто - не работает в игре и всё)

Чтобы определить, что не работает именно скрипт, а не условия например (как мне казалось), пришлось кучу экспериментов поставить. А это каждый раз запусти игру, загрузи сейв, добавь крылья, активируй, побегай по локации, подёргай кого то, и т.п. ... и всё это время, время, КУЧА времени !
Я уже забыл, зачем мне всё это было нужно !!

******************************************************************************************
А теперь, когда меня попустило, хочу ещё вопросик задать :)
- есть ли способ поменять игровую переменную "fJumpHeightMin" без скрипта (например как в перке, где некоторые параметры можно умножать на число) ?

Мой Блог
AleksTirex  Offline  Сообщение №1037 написано: 9 мая 2014, 12:14 | Отредактировано: AleksTirex - 9 мая 2014, 12:18


Архимаг


371
Цитата anton

есть ли способ поменять игровую переменную "fJumpHeightMin" без скрипта (например как в перке, где некоторые параметры можно умножать на число) ?



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

А чем скрипт плох? Можно сделать имитацию перка через абилку на ГГ. В абилке (но не на эффекте) ставишь условия "Если одеты крылья". И на эффекте скрипт:

Event OnEffectStart(Actor akTarget, Actor akCaster)
Game.SetGameSettingFloat("fJumpHeightMin", fNewValue)
endEvent

Event OnEffectFinish(Actor akTarget, Actor akCaster)
Game.SetGameSettingFloat("fJumpHeightMin", fdefaultValue)
endEvent

Добавлено (09 Мая 2014, 16:14)
---------------------------------------------
anton, и даже больше можно сделать - добавить второй эффект (в абилке на нём добавить условие "если бежит") с новым скриптом, тогда при беге можно будет прыгать ещё выше, нежели при прыжке с места. (этот параметр ещё больше увеличить).

float fValue

Event OnEffectStart(Actor akTarget, Actor akCaster)
fValue = Game.GetGameSettingFloat("fJumpHeightMin")
Game.SetGameSettingFloat("fJumpHeightMin", fNewHighValue)
endEvent

Event OnEffectFinish(Actor akTarget, Actor akCaster)
Game.SetGameSettingFloat("fJumpHeightMin", fValue)
endEvent

****************
Переменные, кроме fValue пиши циферками, в виде переменных они написаны для образца.

anton  Offline  Сообщение №1038 написано: 9 мая 2014, 12:55 | Отредактировано: anton - 9 мая 2014, 12:57



362
AleksTirex, скрипт тоже хорошая штука, просто я в последнее время открыл для себя столько новых способов сделать что то без него. Это и Перки со своими условиями, и Алиасы и Маг-эффекты. Всё это позволяет обойтись возможностями самого движка, что не только очень радует, но и расширяет совместимость, да и некоторой стабильности тоже добавляется (ведь мод получается проще). Ну в общем нравится мне и всё тут :)
А абилку я обязательно попробую, хотя если скрипт использовать, можно и просто в нужном маг-эффекте при вызове это сделать...

И попутно ещё вопросик:
* есть маг-эффект длящийся 10 дней, запускается зельем, при этом добавляя ГГ заклинание переключатель (ну и крылья тоже :) ).
* есть маг-эффект длящийся 1 сек, запускается другим зельем (убирая крылья, по кейворду (без скрипта), подменяя пустым маг-эффектом и исчезая по времени).
-> Как правильно сделать это заклинание переключатель, между этими 2-мя маг-эффектами, чтобы кастуя один и то же спелл Крылья то появлялись, то исчезали ?

Я попробовал условия в самом спелле прописать, типа есть кейворд - значит при касте срабатывает удаляющий маг-эффект. Если нет кейворда - другой маг-эффект вызывает крылья.
Но не работает это как надо. Хотя тип спелла FireAndForget, оба маг-эффекта пытаются выполнится одновременно. Как я их не ограничивал, и по времени и по глобальной переменной. Как только стартует маг-эффект крыльев, на ГГ появляется кейворд и тут же срабатывает снятие крыльев. Вот такая штука непонятная. mellow

Мой Блог
AleksTirex  Offline  Сообщение №1039 написано: 9 мая 2014, 13:16


Архимаг


371
Цитата anton

-> Как правильно сделать это заклинание переключатель, между этими 2-мя маг-эффектами, чтобы кастуя один и то же спелл Крылья то появлялись, то исчезали ?



Ты хочешь сделать всё на одном заклинании, без второго уничтожающего?
 
Крылья ты добавляешь скриптом? Тогда сделай добавление "по инверсу":
 
Event OnEffectStart(Actor akTarget, Actor akCaster)
  if akTarget.IsEquipped(крылья)
    akTarget.UnequipItem(крылья, true, true)
  else
    akTarget.EquipItem(крылья, true, true)
  endif
endEvent

 
Event OnEffectFinish(Actor akTarget, Actor akCaster)
  Utility.Wait(1.0)
  if akTarget.IsEquipped(крылья) && !akTarget.HasEffectKeyword(Keyword_эффекта_зелья)
    akTarget.UnequipItem(крылья, true, true)
  endif
endEvent

anton  Offline  Сообщение №1040 написано: 9 мая 2014, 13:42



362
AleksTirex, да, на одном заклинании, но крылья не экипируются, как предмет, они - это Арт-Эффект у маг-эффекта.

Мой Блог
AleksTirex  Offline  Сообщение №1041 написано: 9 мая 2014, 14:04


Архимаг


371
anton, так сделай имитацию экипировки - вместо одевания используй добавление/удаление абилки, на которой и будет этот арт-эффект.
Т.е. твоё заклинание будет включать и выключать (добавлять/удалять) абилку с арт-эффектом. Скрипт, в принципе, останется таким же, только изменятся команды (одеть на добавить и т.д.).
 
К сожалению, не всё и не всегда можно сделать только на дефолте, иногда без скриптов не обойтись.

anton  Offline  Сообщение №1042 написано: 9 мая 2014, 15:01 | Отредактировано: anton - 9 мая 2014, 15:02



362
AleksTirex, что есть то есть. Про абилки сейчас подумаю, может быть красивее получится...

Т.к. сейчас я сделал по другому: добавил глобальную переменную-ключ и маг-эффект-счётчик. Считает он сколько раз игрок кастанул заклинание.
(считает конечно скриптом)
А в свойствах спелла-переключателя (которое добавляется к ГГ при выпивании зелья) стоят три маг эффекта:
- первый, одевает крылья, увеличивает высоту прыжка, убирает урон от падения (если глобалка==0)
- второй, снимает крылья, и уменьшает высоту прыжка, включает урон от падения (если глобалка==1), и переводит глобалку в =2
- третий, при каждом касте спела увеличивает глобалку на 1, а когда глобалка >=2, сбрасывает её в 0
(снимать маг-эффект крыльев конечно не обязательно, они отпадают сами, когда глобалка становиться >0, но там ещё скрипт выполнить надо, так что не помешает)

Вот так вот я заморочился, чтобы сделать спелл-переключатель. ^_^

Мой Блог
mxac  Offline  Сообщение №1043 написано: 27 мая 2014, 19:17



178
Ребят, можно ли из скрипта запустить спелл(без функций SKSE)? И как если можно


Dsion  Offline  Сообщение №1044 написано: 27 мая 2014, 21:58



Цитата mxac

Ребят, можно ли из скрипта запустить спелл(без функций SKSE)? И как если можно


Просто скастить спелл? Можно, конечно.

Spell Property SomeSpell Auto
SomeSpell.Cast(akSource, akTarget)

mxac  Offline  Сообщение №1045 написано: 28 мая 2014, 12:06



178
Цитата Dsion

Spell Property SomeSpell Auto

 А в скрипт на маг эффект его впихнуть можно(чтобы маг эффект кастил спелл), и кстати что нужно вписать в источник(akSource)?
 Вот например стартует мой маг эффект и нужно чтобы скастовалось заклинание(кстати можно ли поддерживать заклинание типа концентрация), а заклинание совсем левое,т.е. его мы не знаем и выучить никак нельзя.


Dsion  Offline  Сообщение №1046 написано: 28 мая 2014, 14:00 | Отредактировано: Dsion - 28 мая 2014, 14:12



Э? Не очень ясно, что ты там придумал. Потому расскажу всё. :)
Допустим, есть заклинание (Spell). В заклинании есть магический эффект (Magic Effect). А на эффекте есть скрипт... Ты кастишь это заклинание. -> Магический эффект накладывается на врага, на союзника или на тебя (смотря как настроен эффект). И, вместе с эффектом, на эту цель вешается скрипт.

Когда эффект вешается, в скрипте вызывается Event OnEffectStart(Actor akTarget, Actor akCaster).

Если нужно, чтоб все, на кого вешается эффект, сразу начинали что-то кастить:

Scriptname test extends activemagiceffect

Spell Property SomeSpell Auto

Event OnEffectStart(Actor akTarget, Actor akCaster)
SomeSpell.Cast(akTarget, akCaster)
EndEvent

Наверное, должно работать... Но я не проверял. Важно не забыть заполнить SomeSpell Property. Каким-то реальным спеллом.
Источник - то, что кастит. Цель - понятно. Наверное, туда любых Actor или ObjectReference можно вписывать.

Вряд ли тебе это всё подойдет... Эта функция (Cast) не совсем так работает, как обычный каст. Если расскажешь, что задумал, можно поискать другие решения...

mxac  Offline  Сообщение №1047 написано: 29 мая 2014, 08:07 | Отредактировано: mxac - 29 мая 2014, 10:47



178
Делаю зелье обнаружения жизни, если просто использовать маг эффект, то показывает только тех что в поле видимости, отсюда вытекает что нужно использовать спелл(в его настройках устанавливается чтобы игнорировались стены). Хотя может есть скрипт какой на то чтобы включить игнорирование стен у маг эффекта?
Как сделать чтобы через каждые 5 секунд происходил рекаст заклинания? наверно через RegisterForUpdateGameTime но Я немогу нормально всё настроить...


Dsion  Offline  Сообщение №1048 написано: 29 мая 2014, 14:46



Я даже не понимаю, что не так с обычным обнаружением жизни :( Оно же видит через стены нормально...
Если нужно что-то делать каждые 5 секунд, лучше всего использовать RegisterForSingleUpdate. RegisterForUpdate и RegisterForUpdateGameTime могут вызвать небольше проблемы после отключения мода... Это не культурно.

Event OnInit()
RegisterForSingleUpdate(5.0)
EndEvent

Event OnUpdate()
...
...
...
RegisterForSingleUpdate(5.0)
EndEvent

mxac  Offline  Сообщение №1049 написано: 29 мая 2014, 16:09 | Отредактировано: mxac - 29 мая 2014, 16:46



178
Цитата Dsion

Я даже не понимаю, что не так с обычным обнаружением жизни Оно же видит через стены нормально...

Сам маг эффект не видит(проверял и если маг эффект архитипа Detect Life - как заклинание школы изменения, и если маг эффект архитипа Value Modifier с Assoc.Item1 : DetectLifeRange - как крик - шопот ауры, и вой оборотня  - запах крови) пока не запихнёшь его в спелл и галочку не поставишь у "Area Effect Ignores LOS"(кстати это через скрипт с маг эффектом сделать нельзя случайно?)

Всё, спасибо, наконецто заработало как надо. Плюс больше опыта в скриптописании стало пока эксперементировал.


Dsion  Offline  Сообщение №1050 написано: 29 мая 2014, 17:56 | Отредактировано: Dsion - 29 мая 2014, 17:58



Ооо. До меня наконец-то дошла суть проблемы :)

Добавлено (29 Мая 2014, 21:51)
---------------------------------------------
Разобрался, как работает обнаружение жизни. Происходит что-то типа невидимого взрыв и на всех, кто удовлетворяет условиям, вешается шейдер.
И действительно, если не стоит галочка "IgnoresLOS" шейдер не вешается на тех, кто за стенами.
Кроме того, если заклинание не Concentration, то взрыв поисходит только один раз и на врагов, которые появились в радиусе после, шейдер уже не вешается.

Приходит в голову несколько вариантов:
1) Скрипт кастит спелл каждые 5 секунд, как ты и хотел. Рад, что заработало.
2) Вообще забить на архетип Detect Life. Добавлять игроку Constant Effect типа Cloak (как огненный плащ), который будет вешать на всех вокруг шейдер.

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





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