Модератор форума: 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? Пиши не в ЛС, а в эту тему.
Dsion  Offline  Сообщение №2311 написано: 20 января 2017, 12:31 | Отредактировано: Dsion - 20 января 2017, 12:37



Lexo, ну блин, снова ты скрипты пишешь, сотона :) Не твоё же! В одной строчке три ошибки:

Код
Game.GetPlayer().GetItemCount().HasKeyword(MyKeyword) >= 1


- нельзя вызвать GetItemCount() без аргумента (объект)
- нельзя вызвать HasKeyword() на типе "целое число"
- нелогично выполнять >= 1 на булевой переменной

AlexeyVN  Offline  Сообщение №2312 написано: 20 января 2017, 12:39



52
Lexo, Спасибо за внимания,  я не разобрался с массивами но решил свою проблему через FormList
If  Game.GetPlayer().GetItemCount(MaskList) >= 1:)

Dsion  Offline  Сообщение №2313 написано: 20 января 2017, 12:47 | Отредактировано: Dsion - 20 января 2017, 12:49



AlexeyVN, Lexo тоже нормально придумал. GetItemCount, если верить creationkit.com, поддерживает и простые базовые объекты, и формлисты, и кейворды. Так что действительно можно было бы повесить на маски уникальный кейворд, а потом выполнять:
Код
GetItemCount(someKeyword) > 0

Ну и еще дофига вариантов было...
А когда без длинной строки реально никак, её можно красиво разделить символом "\". Как-то так:

Код
If (\
        True || \
        True || \
        True || \
        True\
        )

    Debug.Notification("1");
EndIf

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


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


223
А по поводу отслеживания карманных краж не будет у вас мыслей?

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

Dsion  Offline  Сообщение №2315 написано: 20 января 2017, 13:07 | Отредактировано: Multigone - 23 апреля 2020, 09:28



Lexo, у меня? Да нет... Правильного и красивого варианта не знаю... Можно попробовать вот такие два:

1. Создать квест (всегда запущен). В квесте алиас игрока. На алиас игрока скрипт. В скрипт:

Код
Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer)
    Debug.MessageBox(akSourceContainer);
EndEvent


По идее это событие должно срабатывать каждый раз, когда что-то попадает игроку в инвентарь, а akSourceContainer - откуда (из какого контейнера) оно попадает к игроку.
Если akSourceContainer действительно работает, можно при помощи каста или кейворда проверить, что это NPC, что он жив и не является спутником игрока. Нет, это всё фигня, если подумать... Будет ложно срабатывает даже если игрок просто берет подарок у НИП... Можно добавить проверку, что игрок в режиме скрытности.. Но все-равно не надежно...

2. Сделать перк, перехватывающий активацию NPC в режиме скрытности, устанавливающий переменную типа "игрокГрабитТого-то", выполнять настоящую активацию, очищать переменную. А в ивенте OnItemAdded проверять эту переменную. В принципе, такое работало бы, но: 1) сложновато 2) будет ложное срабатываение, если игрок откроет воровство, а потом откроет консоль и добавит что-то себе...

А нормального варианта не знаю :(

Если объект уникальный или квестовый, то кражу легко отследить. Проблемы только с отслеживанием любой кражи.

PitrPokir  Offline  Сообщение №2316 написано: 20 января 2017, 15:47 | Отредактировано: PitrPokir - 20 января 2017, 16:09



26
Dsion, вот 2 скрина и 2 кода их скриптов. Возможно, так будет проще избежать недопонимания в дальнейшем и не придется читать так много моих нубских объяснений)

Касательно вопросов:
1) Ты уверен, что второй эффект накладывается именно на труп? А первый - именно на игрока?
- Насчет первого уверен. Я проверял лог папируса, с трудом нашел нужную строчку из всего хлама, но там в Таргете и Кастере было ID игрока и предмет удаляется у него. А вот второй работает на оживленного мертвеца, как я понял. Ранее я делал отдельный спелл на удаление предметов и он на трупов не работал.
2) Если на первый эффект (реанимация) повесить условия типа "subject isdead", то на ком оно будут проверяться: на игроке или на цели?
- Думаю, что на цели, потому что есть условие проверки ингредиента и проверяет именно у цели.
3) Если на второй эффект повесить условия, на ком они будут проверяться?
- Проверяются на том, что указано.

Dsion  Offline  Сообщение №2317 написано: 20 января 2017, 16:09 | Отредактировано: Dsion - 20 января 2017, 16:31



Да что-то не стало намного проще :) Скрины не отображаются, а скрипты нет смысла читать, пока не будет ясно, на кого вешается эффект.
Можешь временно заменить скрипты на первом и втором эффекте на вот такие:

Код
Event OnEffectStart(Actor aTarget, Actor aCaster)
       Debug.MessageBox("1 " + aTarget + " " + aCaster);
EndEvent

только во втором "1 " заменить на "2 ".
После этого хоть станет ясно, на кого накладываются эффекты. Вернее, с какими аргументами вызывается oneffectstart,

Добавлено (20 Января 2017, 19:09)
---------------------------------------------
Ну если ты точно уверен (без предложенной проверки), что:
1. Скрипт первого эффекта срабатывает с taget=игрок и caster=игрок
2. Скрипт второго эффекта срабатывает с target=труп и caster=игрок
3. При проверке условий на всех эффектах subject=труп.
то никаких проблем. Условия на эффектах нужны одинаковые. Проверка мертвости, проверка наличия пыли, проверки пригодности к реанимированию, проверка того, не реанимирован ли он уже.
А скрипт только на второй эффект:
akTarget.RemoveItem(NecroRiseIngr, 1)
и всё...
Просекаешь, да? Только тогда, когда цель реально валяется мертвая и без дела (и с пылью), тогда оба эффекта срабатывают (всегда только вместе). Один реанимирует, а втрой - удаляет пыль.

PitrPokir  Offline  Сообщение №2318 написано: 20 января 2017, 17:15 | Отредактировано: PitrPokir - 20 января 2017, 17:23



26
Dsion, скрины поправил, предложенную проверку сделал.
1. Да. Игрок и игрок.
2. ID трупа и ID таргета совпадают, так что осмелюсь предположить, что работает таки на труп. Да.
3. Да.
Сейчас проверю.

Добавлено (20 Января 2017, 20:15)
---------------------------------------------
Наконец-то, работает как надо! Может, конечно, если поизвращаться, то можно будет найти такое состояние цели, когда реанимация не сработает, а удаление предмета сработает, но я ничего не могу придумать :D
Спасибо большое за помощь, я почему-то недосмотрел все условия, начал какие-то глобальные переменные вводить, а ведь истина была близко. Еще сбило с толку то, что отдельное заклинание с удалением предмета не работало на трупы. До сих пор не могу понять почему, может архетип заклинания опять был неподходящий, то ли в условиях ошибся... ну да ладно. Еще раз спасибо.

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



Может, нужна галочка no death dispel (позволяет эффекту работать на трупе)... Лично я вообще не пробовал накладывать эффекты на трупы... И не уверен, как там всё работает...

PitrPokir  Offline  Сообщение №2320 написано: 22 января 2017, 20:24



26
Как можно при клонировании актера выделить клона, что бы проводить над ним дальнейшие операции, а не над целью, которую клонировали? Хотелось бы наложить несколько эффектов на клона.
Использую функцию PlaceActorAtMe, альтернатив не встречал:

Код
Actor Property GhostActor Auto
ActorBase Property GhostActorBase  Auto  

Event OnEffectStart(Actor Target, Actor Caster)
       GhostActor = Target
       GhostActorBase = GhostActor.GetBaseObject() as ActorBase
       GhostActor.PlaceActorAtMe(GhostActorBase)
EndEvent

И реально ли сделать клон с такой же внешностью, экипировкой и параметрами, как и у цели? Если клонировать уникального НПС, то так и работает, а если какого-то бандита или драугра, то клон другой.

Dsion  Offline  Сообщение №2321 написано: 23 января 2017, 12:35



PitrPokir, вот так не пробовал?

Код
Actor Clone = GhostActor.PlaceActorAtMe(GhostActorBase);
Clone.Kill();


А за внешность не знаю...

AlexeyVN  Offline  Сообщение №2322 написано: 23 января 2017, 18:12 | Отредактировано: Multigone - 23 апреля 2020, 09:29



52
Здравствуйте, помогите со скриптом пожалуйста
Код

Enchanting = akItemReference.GetEnchantment()
Float magnitude = Enchanting.GetNthEffectMagnitude(0)
Float NewMagnitude = magnitude * 1.2

Enchanting.SetNthEffectMagnitude(0, NewMagnitude)

Это часть скрипта он висит на Allias игрока, проблема в том что NewMagnitude меняется на всех предметах с таким же зачарованнием
Можно ли это как нибудь исправить?

Dsion  Offline  Сообщение №2323 написано: 23 января 2017, 18:26



AlexeyVN, вряд ли... Энчант-то один и тот же... И я не уверен, что это сохраняется после перезапуска игры...
Можешь посмотреть перковую энтри пойни  "Mod Incoming Spell Magnitude". Её, вроде, можно настроить, чтоб усиливать энчант на каком-то конкретном предмете...

AlexeyVN  Offline  Сообщение №2324 написано: 23 января 2017, 19:17 | Отредактировано: AlexeyVN - 23 января 2017, 19:37



52
Dsion, Изменения чар  сохраняются ,  Я проверил )))))) Спасибо буду рассматривать Mod Incoming Spell Magnitude

в моём варианте Mod Incoming Spell Magnitude не подходит 
Может как нибудь можно сделать после изменения магнитуды зачарование становилось новым?

Dsion  Offline  Сообщение №2325 написано: 23 января 2017, 19:59



AlexeyVN, в Обливионе можно было, а в Скайриме - вроде, нет. Да и предмет тоже пришлось бы клонировать. Иначе заменится зачарование на всех таких предметах.
Лучше почеши репу на Mod Incoming Spell Magnitude... Наверняка как-то можно прикрутить... Или расскажи, что делаешь там такое...

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



52
Dsion,  Суть такая Есть Алтарь который открывает GifMenu c выбором усилить чары или снять чары, при выборе одного из пунктов предмет выбрасывается на алтарь и там происходят чудеса. Скрипт на Alias Игрока:

Код
  Event OnItemRemoved(Form akBaseItem, Int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)

            If bL &&  Ui.IsMenuOpen("GiftMenu")
                akItemReference = akDestContainer.DropObject(akBaseItem, 1)
                If akItemReference.GetEnchantment()
                    Button = AlexDisenchantMessage.Show()
                    If Button == 0
                        Input.TapKey(0x1)
                        AnimPlayer = True
                        Debug.sendAnimationEvent(Game.GetPlayer(), "IdleEnchantingCraft")
                        Translation(akItemReference)
                        DisenchantAltarFX.PlayAnimation("PlayAnim02")     
              Utility.Wait(8)
           
                         DisenchantAltar.PlayAnimation("Open")
                         Anim = false

                         Enchanting = akItemReference.GetEnchantment()
                         Float magnitude = Enchanting.GetNthEffectMagnitude(0)
                         Float NewMagnitude = magnitude * 1.2

                         Enchanting.SetNthEffectMagnitude(0, NewMagnitude)
                    
         
                         TargetVFX.Play(akItemReference,5.9, DisenchantAltarFX )              
    CasterVFX.Play(DisenchantAltarFX,5.9,akItemReference)

               ElseIf Button == 1
                         Input.TapKey(0x1)
                         AnimPlayer = True
                         Debug.sendAnimationEvent(Game.GetPlayer(), "IdleEnchantingCraft")
                         Translation(akItemReference)
                         DisenchantAltarFX.PlayAnimation("PlayAnim02")     
               Utility.Wait(8)
           
                          DisenchantAltar.PlayAnimation("Open")
                          Anim = False
         
                         TargetVFX.Play(akItemReference,4.7, DisenchantAltarFX )              
    CasterVFX.Play(DisenchantAltarFX,5.9,akItemReference)
                         akItemReference.SetEnchantment(none, 0.0)

                   Else
                         Game.GetPlayer().AddItem(akItemReference, 1, true)
                         AnimPlayer = False
                   EndIf   
               Else
                   Game.GetPlayer().AddItem(akItemReference, 1, true)
                   AnimPlayer = False
                EndIf    
             EndIf

EndEvent

Dsion  Offline  Сообщение №2327 написано: 23 января 2017, 20:36 | Отредактировано: Dsion - 23 января 2017, 20:37



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

AlexeyVN  Offline  Сообщение №2328 написано: 23 января 2017, 20:47



52
Dsion, GiftMenu Открывается с предметами которые не имеют базовых чар, то есть те предметы которые не имеют чар и те которые игрок зачаровал
вот с тех предметов которые зачаровал игрок и снимаются чары. в игре проверял со снятием чар вроде всё нормально а вот с усилением походу придётся поломать голову

Dsion  Offline  Сообщение №2329 написано: 23 января 2017, 20:51 | Отредактировано: Dsion - 23 января 2017, 20:52



А как алтарь проверят, что зачарование еще не усилено? Или можно усиливать бесконечно? С перком нормально работало бы, мне кажется.
Ладно-ладно, не моё дело...

AlexeyVN  Offline  Сообщение №2330 написано: 23 января 2017, 21:02 | Отредактировано: AlexeyVN - 23 января 2017, 21:09



52
Dsion, Я думал  сделать ограничения но это позже сначала разберусь с этой проблемой А как через перк можно определить чары предмета который выкидываешь?

Dsion  Offline  Сообщение №2331 написано: 23 января 2017, 21:10



Перк без условий усилит для игрока все зачарования на всех предметах и все входящие заклинания. Так что вопрос, скорее, такой: какие повесить условия, чтоб он усиливал только зачарования и только на вещах, побывавших на алтаре. Ответ: пока не знаю :) У меня сейчас нету доступа к СК и я не помню, что там.

AlexeyVN  Offline  Сообщение №2332 написано: 23 января 2017, 22:35



52
Dsion, Вопрос пряма с языка сняли  :D Буду думать над условиями, а будут какие нибудь предложения c удовольствием их рассмотрю

Добавлено (24 Января 2017, 01:35)
---------------------------------------------
Dsion, Mod Incoming Spell Magnitude это не работает, а Mod  Spell Magnitude работает с Entry point разобрался теперь условия остались


Lexo  Offline  Сообщение №2333 написано: 26 января 2017, 10:35 | Отредактировано: Lexo - 26 января 2017, 11:32


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


223
У меня очередной тупой вопрос... уж извините, но я на него так и не нашёл ответа...

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

Добавлено (26 Января 2017, 13:35)
---------------------------------------------
DsionAlexeyVN, а не легче сделать через кейворд что бы усиливались только чары с определённым кейвордом? или формлист? Сделать скрипт, который, когда алтарь усилит какое-то зачарование, оно (или он - предмет) кидается в специальный формлист?

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

Dsion  Offline  Сообщение №2334 написано: 26 января 2017, 18:46



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

Lexo  Offline  Сообщение №2335 написано: 26 января 2017, 19:33


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


223
Да, вот с перком самое то... хочу сделать вероятность того, что закрытый замок окажется... не до конца закрытым, и когда игрок попытается его взломать - он просто откроется...

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

Dsion  Offline  Сообщение №2336 написано: 26 января 2017, 19:35



Аааа... да, перк сойдет...

Lexo  Offline  Сообщение №2337 написано: 26 января 2017, 19:59


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


223
Цитата Dsion

что у тебя за идеи такие всегда


Да вот... последствия бурной фантазии и обязательств, в связи с начатым модом... обещал сделать по 20 талантов в каждой ветке - пытаюсь сделать... буквально из пальца уже...

Добавлено (26 Января 2017, 22:59)
---------------------------------------------
И то, это я ещё отвергаю самые безумные или невыполнимые идеи...


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

Dsion  Offline  Сообщение №2338 написано: 26 января 2017, 21:03 | Отредактировано: Dsion - 26 января 2017, 21:04



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

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


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


223
Цитата Dsion

В скрипте перка можно что-то сделать и перед активацией, и после


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

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

Dsion  Offline  Сообщение №2340 написано: 27 января 2017, 17:16



Lexo, я особо помочь не смогу - сейчас нету СК. Могу только по памяти.
Сначала создаешь перк с Entry Point: Add Activation Choice. Потом убеждаешься, что этот перк попадает к игроку. Можно просто запомнить id и добавлять его игроку консольной командой addperk.
В Add Activation Choice, по моему, нужно поставить галочки replace default и еще там какую-то. В поле скрипта сначала вписываешь просто
Debug.MessageBox("Siski");
Потом проверяешь в игре. Активация абсолютно любого объекта или NPC должна выбивать сообщение Siski. И всё, сама активация не должна срабатывать.
Потом навешиваешь на перк условий, чтоб срабатывал только на закрытые двери и контейнеры. GetIsObjectType, GetLocked, GetLocklevel. В таком духе.
А потом изменяешь скрипт на перке вот так:


Код
Debug.MessageBox("start" + akTargetRef);
akTargetRef.Activate(Game.GetPlayer());
Utility.Wait(0.5);
Debug.MessageBox("finish" + akTargetRef.GetLockLevel());


ну или не так... Но что-то в этом духе..

Добавлено (27 Января 2017, 20:16)
---------------------------------------------
Вместо сообщения "start" можно добавить открывание двери с каким-то шансом.
А вместо "finish", по идее, можно сделать проверку того, открыл ли игрок замок и сделать что-то, в зависимости от результата.
Выглядит мутновато, но ничего лучше в голову не приходит.


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





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