Модератор форума: 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? Пиши не в ЛС, а в эту тему.
Lexo  Offline  Сообщение №2281 написано: 10 января 2017, 07:59


Всепознающий мододел


223
PitrPokir, да, говорят, что после обновления 1.7 (если не ошибаюсь) Беседчики сделали так, что призыв существ и поднятие нежити становится эффектом "На себя".
Кстати, это создало кучу проблем, с поглощением заклинаний (талант "Атронах" и т.п.). Поэтому надо что-то думать...

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

PitrPokir  Offline  Сообщение №2282 написано: 10 января 2017, 12:34 | Отредактировано: PitrPokir - 10 января 2017, 12:35



26
Lexo, а сработает, если создать какой-то эффект на цель, типа захвата душ, который и удалит предметы с трупа, а после него что бы активировался скрипт оживления?

Подскажите, пожалуйста, как выглядит команда на добавление эффекта? Или AddSpell подойдет?

Kepper  Offline  Сообщение №2283 написано: 10 января 2017, 13:25 | Отредактировано: Kepper - 10 января 2017, 13:27



860
PitrPokir, AddSpell не подойдёт. Зачем обучать труп заклинанию поднятия мертвеца? Это ведь не способность.
Лучше воспользуйся
Cast(ObjectReference akSource, ObjectReference akTarget)

Повесь этот скрипт на какое-нибудь заклинание типа огненная стрела
Код
Scriptname NecroReanimateNPCScript extends ActiveMagicEffect

MagicEffect Property NecroReanimateEffect  Auto
Ingredient Property IngrVampDust  Auto
Spell property ReanimateSpell auto

Event OnEffectStart(Actor akTarget, Actor akCaster)
    Debug.Trace("TEST  akTarget="+akTarget+"   akCaster="+akCaster)
    akTarget.RemoveItem(IngrVampDust, 1, false)
    ReanimateSpell.Cast(akCaster, akTarget)
EndEvent

PitrPokir  Offline  Сообщение №2284 написано: 12 января 2017, 13:44 | Отредактировано: PitrPokir - 10 января 2017, 17:40



26
Kepper, повесил на огненную стрелу. Мертвых фаербол просто швыряет, никаких эффектов. Ни удаление предмета, ни оживление, несмотря на скрипт.
На живых работает полностью. Сначала летит фаербол, потом при попадании вылетает спелл на оживление. Предметы тоже удаляются.

Сделал отдельно заклинание оживления без скрипта на удаление предметов и отдельно фаербол на удаление предметов. На живых и оживленных фаербол работает как надо, удаляет предметы и у тех, и у других. Пробовал так же делать заклинание с двумя эффектами, первый оживляет, а второй повышает атрибут, на нем же висит скрипт на удаление предмета. В итоге труп вообще не оживлялся, вылезало сообщение, что "избегает воздействия"...
Чую, что у этой механики оживления кучу подводных камней, по крайней мере в самом процессе накладывании эффекта.

ЗАРАБОТАЛО!
Прошу прощение за дезинформацию в вышесказанном, это моя невнимательность. Вариант с двумя маг.эффектами в одном заклинании как раз рабочий. Один эффект - само оживление, другой же пуст, но на нем висит скрипт на удаление предмета (еще я там выбирал в Effect Archetype вариант Script, но я не уверен, что это имеет влияние в данном случае). Таким способом работает. Просто я не обратил внимание и не убрал кривой перк в условии, оно не давало эффекту запуститься.
Всем большое спасибо за помощь.

Добавлено (12 Января 2017, 16:44)
---------------------------------------------
Подскажите, пожалуйста, как в папирусе выглядит функция или команда, которая повышает лимит призванных существ?
В перках есть строчка "modify commanded actor limit", но доступные на выбор функции не дают достаточной гибкости. Как это вообще можно с помощью скрипта реализовать?


Dsion  Offline  Сообщение №2285 написано: 12 января 2017, 14:45



PitrPokir, не видел ничего такого. По-моему, только через перк. Хотя перком можно управлять из скрипта в какой-то мере. Можно сделать, чтоб какая-то глобальная переменная указывала максимальное количество призванных существ. Из скриптов или из консоли переменную можно было бы менять, а в перке штук 10 энтри поинтов такого типа:
1. Установить макс. количество существ в 1, если значение переменной  == 1
2. Установить макс. количество существ в 2, если значение переменной  == 2
итп

PitrPokir  Offline  Сообщение №2286 написано: 13 января 2017, 00:02 | Отредактировано: PitrPokir - 13 января 2017, 00:15



26
Dsion, не совсем то, что мне надо, но способ учту, спасибо.

Lexo, я ввел дополнительную ветку в колдовство и несколько новых существ для призыва, некоторые перки повышают лимит этих суммонов, но дефолтных не трогают. Тем не менее, они все-равно имеют негативное влияние. Если превысить их лимит, то уничтожаются сразу все мои суммоны, что не может не огорчать и доставлять много неудобств в самой игре.
Если я плохо выразился, то приведу пример. Допустим, я оживил или призвал 5 скелетов из своего мода и 1 дефолтного огненного атронаха. Нежить связана ключевыми словами с новыми перками на повышение лимита, а атронах не тронут, его лимит дефолтный. Я призываю еще одного атронаха и почему-то при превышении лимита взамен уничтожается не атронах, не один скелет, а сразу все. Понятное дело, что 2 атронаха без перка "парные души" быть не может, но и ломать всех моих ребят за раз тоже как-то не вежливо.
Я хотел как-то сделать, что бы дефолтные существа при призыве записывались в какую-то отдельную переменную и заменяли друг друга, а не всех моих сразу. Ну или хотя бы по одному. Но пока не добился в этом успеха.
Еще думал на призыв существ с дефолтными ключевыми словами прицепить скрипт, который будет сам уничтожать уже призванного дефолтного суммона и тем самым освобождать место для нового до того, как игра решит устроить геноцид всей моей нежити. Но в силу своей неопытности пока только думаю как это реализовать.

Dsion  Offline  Сообщение №2287 написано: 13 января 2017, 05:10 | Отредактировано: Dsion - 13 января 2017, 05:14



PitrPokir, можешь оставить ванильные лимиты как есть, а свою нежить вызывать не магическим эффектом "summon creature", а скриптовой командой. И тогда извращайся как хочешь... Пока ты своих саммонов скриптовой же командой не удалишь, никуда они не денутся. Ну только придется с актором поработать: сделать им пакет для следования за игроком, сделать им скриптик для самоуничтожения по таймеру итп. Если будешь так делать, не забудь перепроверить трижды, что референсы правильно удаляются. Или можно заранее создать штук 30 референсов скелетов, а потом с ними работать. Когда надо призывать: reset, enable, moveto; а когда он умирает или истекает время: disable. Такой вариант чуть надежнее потому что с ним ты точно не налажаешь и сейвгейм не начнет забиваться неудаленными референсами.

PitrPokir  Offline  Сообщение №2288 написано: 13 января 2017, 15:25



26
Dsion, а нельзя просто повесить скрипт на перк, который будет контролировать количество дефолтных суммонов? Т.е. код, который будет убивать/завершать эффект дефолтного суммона, если игрок призывает нового. Лимит при этом можно задать сразу всем и не будет конфликта, о котором я писал. Ну, это, конечно, в теории.
Я просто плохо знаю папирус и у меня на реализацию этого минимум день уйдет, поэтому не могу сразу все проверить.

AlexeyVN  Offline  Сообщение №2289 написано: 16 января 2017, 16:31 | Отредактировано: Multigone - 23 апреля 2020, 09:35



52
Dsion, Здравствуйте, лазал по форуму  увидел  ваш скрипт. Вы  не могли бы мне объяснить   почему он не срабатывает на пентаграме душ и на точильном камне? ведь там тоже что то добавляется в инвентарь.

Код
Event OnSit(ObjectReference akFurniture)          
If (akFurniture)              
   Crafting = True            
EndIf  
EndEvent
  Event OnGetUp(ObjectReference akFurniture)
              Crafting = False
   EndEvent
Event OnItemAdded(Form akBaseItem, Int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer)
      If (Crafting)          
Debug.MessageBox(akBaseItem)
EndIf
EndEvent

Dsion  Offline  Сообщение №2290 написано: 16 января 2017, 16:35 | Отредактировано: Dsion - 16 января 2017, 16:36



Ой, это я такое написал? Жуть какая.
Если надо отследить крафт, попробуй использовать Story Manager Event. Посмотри в SM Event Node.
Ну или еще что-то. Но точно не такой скрипт :)

AlexeyVN  Offline  Сообщение №2291 написано: 16 января 2017, 16:42



52
Dsion, :D  А Story Manager Event можно так будет сделать?   каждый раз как  я зачаровываю предмет он попaдал в FormList

Dsion  Offline  Сообщение №2292 написано: 16 января 2017, 16:46 | Отредактировано: Multigone - 23 апреля 2020, 09:38



Ага, можно-можно. Там можно и референс предмета получить, и референс "стола", на котором он создан. На референсе стола можно ключевые слова проверять.

Посмотрел. Там вообще-то скрипт не такой, как ты скопировал :) А я то думал "неужели я забыл сделать проверку того, на что именно садится игрок". Оказывается, не забыл)

Квест ты создал, да? Алиас игрок в квесте тоже создал? Скрипт на алиас повесил? И не работает?
Добавь в Event OnSit строчку типа:
Debug.MessageBox("sit")
Сначала узнаем, срабатывает ли ивент, когда игрок садится за точильный камень.
Можешь еще на обычный стул сесть - должно точно срабатывать.

AlexeyVN  Offline  Сообщение №2293 написано: 17 января 2017, 12:33



52
Dsion, 1) Создал Quect с Event Craft Item
            2) Создал Alias, From Event - Workbench
            3) Создал 0 стадию и повесил скрипт типа Debug.MessageBox()
            4) В SM EVENT NODE - Craft item Создал New Quest Node и повесил на него Quest
            5) в Quest назначил условия  HasKeyword - WiCraftingEnchanting == 1
                                                            Event Data:Workbench - Workbench

вот что я сделал. Mне не ясно как Там можно  референс предмета получить?

Dsion  Offline  Сообщение №2294 написано: 17 января 2017, 13:34



Когда квест запускается таким ивентом, на скрипте квеста сработает
Event OnStoryCraftItem(ObjectReference akBench, Location akLocation, Form akCreatedItem)
ну да, базовый объект только, не референс...

AlexeyVN  Offline  Сообщение №2295 написано: 17 января 2017, 13:46



52
Dsion, я так понял мне этот ивент в скрипт добавить?

Dsion  Offline  Сообщение №2296 написано: 17 января 2017, 14:00 | Отредактировано: Dsion - 17 января 2017, 14:01



ага... если квест уже запускается по факту крафта...
если нужно много крафтов отслеживать, можно в конце ивента останавливать квест обратно.

AlexeyVN  Offline  Сообщение №2297 написано: 17 января 2017, 14:19



52
Dsion,  можете в кратце описать что нужно сделать что бы каждый раз как зачаровывается  предмет он попfдал в formlist

Dsion  Offline  Сообщение №2298 написано: 17 января 2017, 14:25



Понятия не имею. Чтоб базовые объекты добавлялись - это запросто. А вот чтоб референсы - хрен знает. У предметов в инвентаре вообще нету refid.

AlexeyVN  Offline  Сообщение №2299 написано: 17 января 2017, 14:45



52
Dsion, а определить что этот предмет был зачарован играком можно?

Multigone  Offline  Сообщение №2300 написано: 17 января 2017, 20:29



816
Цитата Dsion

У предметов в инвентаре вообще нету refid


Не совсем так. Они есть, просто их нельзя получить с помощью переменных, таких, как:

Код
Event OnObjectEquipped(Form akBaseObject, ObjectReference akReference)
Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer)

Тем не менее, если в окно объектов кинуть кинжал, а в каком-нибудь скрипте заполнить им ObjectReference Property _TESTREFR Auto, то таким кинжалом можно управлять, когда он находится в инвентаре и сложен в стек - например, выбросить его оттуда с помощью _TESTREFR.MoveTo(Game.GetPlayer()).

Если к референсу этого кинжала добавить скрипт, то его self будет хранить информацию о себе, даже когда он попадает в инвентарь:


Код
EVENT OnContainerChanged(ObjectReference xNew, ObjectReference xOld)
    IF xNew && self == _TESTREFR
        Debug.MessageBox("+")
    ENDIF
ENDEVENT



Dsion  Offline  Сообщение №2301 написано: 17 января 2017, 20:34



Ага, если у меня миллион золота, то у каждой монетки свой id...

Multigone  Offline  Сообщение №2302 написано: 17 января 2017, 20:48 | Отредактировано: Multigone - 17 января 2017, 20:52



816
Dsion, если предметы были добавлены в инвентарь не подбором из мира, то у них, конечно, не будет своего id. Когда они будут выброшены, игра сформирует временный refid для этого стека (как если бы использовалась placeatme()). Наверное, поэтому, когда выбрасывается сразу весь стек из камней душ, вместо одной модели появляется несколько - стек из купленных / созданных (не имевших своего id) и отдельным предметом каждый из найденных в мире.

Lexo  Offline  Сообщение №2303 написано: 17 января 2017, 21:01 | Отредактировано: Lexo - 17 января 2017, 21:03


Всепознающий мододел


223
Прошу прощения за мою тупость, но даже с вашими весьма развёрнутыми советами я никак не могу сделать то, что хотел. В общем, пытался сделать бросок щита. Новую анимацию я, разумеется, вставить никак не смог, так что, обходился тем, что есть: условие спринта, блока, и баш-удара. Как ни странно - работает: бегу с щитом (Живой молот), нажимаю кнопку атаки... персонаж останавливается, производит удар щитом, кидается заклинание. По-сути, всё, что нужно. Только... никак не получается сделать так, что бы щит появился на месте удара заклинания (не, можно, конечно, сделать, что типа он бумеранг и возвращается после удара, но это же тупо).

В общем, абилка, висячая на игроке: постоянный эффект - на себя.



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

В общем, скрипт пускает заклинание. Заклинание имеет прожектайл. Прожектайл взрывается. Взрыв производит невидимый активатор. На активаторе скрипт:



Всё до момента "Debug.Notification("Щит упал!")" работает (сообщение высвечивается). Но щит ни в какую не хочет перемещаться к месту удара.

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

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Dsion  Offline  Сообщение №2304 написано: 17 января 2017, 21:42



Lexo, да, писать скрипты - точно не твоё...

Если нужно, чтоб метался именно тот щит, что на игроке, то есть проблема с получением его id. Мне только два ваианта решения приходят на ум:
1. Сделать один уникальный щит и игрок сможет метать только его.
2. Помечать щит при взятии его из мира. Но щит должен именно валяться где-то. А если попал к игроку другим способом, то придется выбросить и взять заново.
Не очень, да?
Ну это единственная проблема. Остальное - легко.

А ты в курсе, что щит можно зафутболить куда-то и без прожектила, взрыва, активатора и прочей ерунды? Можно его "реально" бросить. Сначала разместить у игрока на уровне рук, а потом хорошенько пнуть в направлении взгляда игрока. Вот это было бы весело... А с прожектилом - так себе...

Lexo  Offline  Сообщение №2305 написано: 17 января 2017, 21:57


Всепознающий мододел


223
Цитата Dsion

писать скрипты - точно не твоё

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

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Dsion  Offline  Сообщение №2306 написано: 18 января 2017, 17:05



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

Добавлено (18 Января 2017, 20:05)
---------------------------------------------
Давай, лучше, зафигарим "Молот Тора". Уникальный. Который можно будет метать. И чтоб бандиты ВООЩЕ НАФИГ ОТЛЕТАЛИ при ударе. А после броска, чтоб он летел обратно к хозяину. Круто же?
Я, правда, прямо так сходу не в курсе, как определить, в кого он попал...


AlexeyVN  Offline  Сообщение №2307 написано: 19 января 2017, 20:05



52
Здравствуйте, Подскажите пожалуйста можно ли эту строчку как нибудь сократить?
 If  Game.GetPlayer().GetItemCount(Mask[0]) >= 1|| Game.GetPlayer().GetItemCount(Mask[1]) >= 1|| Game.GetPlayer().GetItemCount(Mask[2]) >= 1|| Game.GetPlayer().GetItemCount(Mask[3]) >= 1 || ............ Game.GetPlayer().GetItemCount(Mask[9]) >= 1

PitrPokir  Offline  Сообщение №2308 написано: 20 января 2017, 00:27



26
Господа, снова без вашей помощи не обойтись.
На прошлой странице я обращался за помощью по поводу скрипта, который должен оживлять мертвеца и при этом удалять у него указанный предмет. Как выяснилось, сам эффект оживления применяется только на себя, поэтому выбрать таргет не удавалось и скрипт работал неправильно. Далее я писал, что нашел решение в виде второго скриптового эффекта, но тут тоже осечка. Я не могу подобрать условия, что бы второй эффект работал именно как второй, т.е. только если первый сработал. Если указать в условиях проверку на наличие эффекта, то получается, что если уже такой эффект есть, не важно когда наложенный, то эффект на удаление предмета будет срабатываться независимо от первого, даже если кастовать в живого нпс или уже оживленного.
Вводил глобальную переменную, в которую прибавлялось +1, если эффект оживления сработал. Тогда во втором эффекте происходила проверка глобальной переменной и только тогда срабатывал, а после команды удаления предмета снова обнулял её. Но почему-то несмотря на то, что значение переменной увеличивалось, второй эффект на это не реагировал. И только со второго раза, когда переменная уже была единицей заранее, второй эффект работал. И так было каждый раз. Т.е. видимо проверка переменной начинается раньше, чем она достигает требований.
Как вообще можно добиться нужного результата? Прошу вашей помощи, т.к. своих идей уже нету. Спасибо за внимание.

Dsion  Offline  Сообщение №2309 написано: 20 января 2017, 12:15



PitrPokir, давай с начала:
1. Ты уверен, что второй эффект накладывается именно на труп? А первый - именно на игрока?
2. Если на первый эффект (реанимация) повесить условия типа "subject isdead", то на ком оно будут проверяться: на игроке или на цели?
3. Если на второй эффект повесить условия, на ком они будут проверяться?

Тебе ведь нельзя просто поднять трупак и удалить у него пыль. На эффекте поднятия должна быть проверка, что у трупа есть пыль. И если пыли нету, эффект не должен срабатывать, да? Как ты это сделал?

Lexo  Offline  Сообщение №2310 написано: 20 января 2017, 12:27


Всепознающий мододел


223
AlexeyVN, если я не прав, то меня исправят опытные товарищи, но...

Я думаю, что на все маски можно повесить один кейворд и написать:

Game.GetPlayer().GetItemCount().HasKeyword(MyKeyword) >= 1

Добавлено (20 Января 2017, 15:26)
---------------------------------------------

Цитата Dsion

Давай, лучше, зафигарим "Молот Тора". Уникальный

Я думал такую фигню с Волендрангом провести... его же по легенде какой-то двемер зафигарил чёрт знает куда, и там образовали Хаммерфелл...

Добавлено (20 Января 2017, 15:27)
---------------------------------------------
Но у меня ещё вопрос: а есть способ отследить, что была успешно проведена карманная кража?


"Всё слишком относительно, что бы утверждать столь однозначно..." ©

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





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