Модератор форума: 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? Пиши не в ЛС, а в эту тему.
Multigone  Offline  Сообщение №2521 написано: 13 августа 2017, 16:32



832
Dsion, я имел в виду обычное заклинание. Снаряд как отдельный референс не даст информации о заклинателе (поскольку его нет). Следовательно, пользоваться таким способом может только игрок.

В целом ты одновременно прав и не совсем. Дело в том, что на projectile физический импульс никак не воздействует. Я провел серию опытов - вне зависимости от указанной модели (имеет ли она инфу о физ. свойствах или нет), а также от флагов, снаряд всегда летит по заданной траектории. Другое дело, если снаряд делать как MovableStatic, тогда он сможет наносить урон столкновением, однако взрыв и прочие плюшки projectile будут ему недоступны.

Но! Можно управлять полетом projectile, используя SetAngle. Там, правда, довольно большие объемы расчетов, но как факт. А референс снаряда получаем триггером, помещаемым под носом игрока (встречные снаряды можно отсеять проверкой углов снаряда и триггера).

К примеру, таким образом мне удалось реализовать ручное управление (примерно как ракетой в Half-Life 2). Правда, те, что летят быстро, не успевают среагировать на большой угол.

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


Код
ScriptName _TESTProjSetAngleSCPTREFR Extends ObjectReference ; Multigone.

Float Property MaxDist = 10000.0 Auto ; Макс. дистанция снаряда от игрока.
Float Property MaxAim = 2000.0 Auto ; Расстояние управляющей точки от игрока.
Float Property MaxAngle = 9.0 Auto ; Макс. угол реакции снаряда за 0.05 сек.

EVENT OnTriggerEnter(ObjectReference xC)
    IF xC.GetBaseObject() AS Projectile
        GoToState("S")
        ObjectReference xT = Game.GetPlayer()
        WHILE xC.Is3DLoaded() && xC.GetDistance(xT) < MaxDist
            Float fX = -xT.GetAngleX()
            Float fZ = 90.0 - xT.GetAngleZ()
            Float fDX = MaxAim * Math.Cos(fZ) * Math.Cos(fX) + xT.X - xC.X
            Float fDY = MaxAim * Math.Cos(fX) * Math.Sin(fZ) + xT.Y - xC.Y
            Float fDZ = MaxAim * Math.Sin(fX) + xT.Z + 90.0 - xC.Z
            fX = xC.GetAngleX()
            fZ = xC.GetAngleZ()
            Float fDAZ = 90.0 - Math.Atan(fDY / fDX) - fZ
            IF fDX < 0.0
                fDAZ += 180.0
            ENDIF
            IF fDAZ > 180.0
                fDAZ -= 360.0
            ELSEIF fDAZ < -180.0
                fDAZ += 360.0
            ENDIF
            xC.SetAngle(fInt(fX + fInt(-Math.Atan(fDZ / Math.Sqrt(fDX * fDX + fDY * fDY)) - fX, MaxAngle, -MaxAngle), 90.0, -90.0), 0.0, fZ + fInt(fDAZ, MaxAngle, -MaxAngle))
            Utility.Wait(0.05)
        ENDWHILE
        GoToState("")
    ENDIF
ENDEVENT

Float FUNCTION fInt(Float A, Float B = 1.0, Float C = 0.0)
    IF B > C
        IF A >= B
            RETURN B
        ELSEIF A < C
            RETURN C
        ENDIF
    ELSEIF A <= B
        RETURN B
    ELSEIF A > C
        RETURN C
    ENDIF
    RETURN A
ENDFUNCTION

STATE S
    EVENT OnTriggerEnter(ObjectReference xR)
    ENDEVENT
ENDSTATE

Lexo, лучший способ раздать заклинание - вовсе не плащ, а эффект с Area. И нагрузка будет меньше, как мне кажется.

Dsion  Offline  Сообщение №2522 написано: 13 августа 2017, 17:08 | Отредактировано: Dsion - 13 августа 2017, 17:13



Multigone, ничо я не неправ) Я думал снаряд именно отдельным объектом сделать, имеющим вес. Информацию в нем можно любую сохранить.
Но с SetAngle, может, даже интереснее. Если не считать часть про размещение триггера.
Интересно, что будет, если создать projectile через функцию PlaceAtMe. Появится ли он и полетит ли куда-то? И кто будет считаться его творцом.

Multigone  Offline  Сообщение №2523 написано: 13 августа 2017, 17:30



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

Добавлено (13 Августа 2017, 20:30)
---------------------------------------------
Dsion, когда спавнишь, по умолчанию применяется matchRotation, как для объекта-источника спавна. На какой угол он повернут, туда и полетит. Наверное. Во всяком случае, реф. снаряда применимы некоторые (если не большинство) функции ObjectReference - Disable, Delete, MoveTo и пр.


Dsion  Offline  Сообщение №2524 написано: 13 августа 2017, 19:06



Multigone, на мой взгляд, ловить снаряд триггером - абсолютно неприемлемо. И предлагаю я от этого избавиться любой ценой.
Если найдется простой способ, то хорошо. А если нет, то да, спавнить какой-нибудь Clutter и добавлять к нему взрыв. Весело же!
А если и это не получится, то вообще забить на идею. Но не оставлять триггер.

Добавлено (13 Августа 2017, 22:06)
---------------------------------------------
Надо будет осенью попробовать прицепить скрипт на projectile. Не в CK, а в hex редакторе. Вдруг выйдет.


Multigone  Offline  Сообщение №2525 написано: 13 августа 2017, 19:29



832
Dsion, а что не так с триггером? Он находится в своей локации, перемещается по требованию и уезжает в закат, когда необходимость отпадает. Есть что-то, чего я не знаю?

Цитата Dsion

попробовать прицепить скрипт

А что там вообще можно сделать? Единственное, получить Self. А если реф. известен извне, не проще запихнуть в алиас.

Parantino  Offline  Сообщение №2526 написано: 14 августа 2017, 02:36



3
Всем трям!
Помогите пожалуйста создать скрипт, который позволит менять создаваемому НПС одежду во время сна на нужную мне?
Беседка во вкладке Актор предусмотрела комплект одежды для сна, но он почему-то не работает.

Dimon892  Offline  Сообщение №2527 написано: 22 августа 2017, 11:00



2
Цитата Miter

Guide находит путь до ближайшей квестовой цели.



Добрый день!

А есть ли возможность получить ссылку на ближайшую квестовую цель? ObjectReference цели? Ведь если ясновидение показывает путь до цели значит как-то возможно получить ссылку на саму цель. Да и в консольных командах есть команда на перемещение к цели квеста. Очень нужно

sansuli  Offline  Сообщение №2528 написано: 5 сентября 2017, 06:43 | Отредактировано: sansuli - 5 сентября 2017, 06:46


The Red Sun


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

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Multigone  Offline  Сообщение №2529 написано: 6 сентября 2017, 21:55



832
sansuli


Код
Scriptname _TESTTEST35 extends activemagiceffect ; SKSE

ObjectReference Property MindXMarkerREF Auto ; Маркер локации.

 ; Автозаполнение.
Static Property XMarker Auto
Spell Property GhostAbility Auto
Spell Property MG08ParalysisAbility Auto

Event OnEffectStart(Actor xT, Actor xC)
    xT.SetGhost()
    xT.BlockActivation()
    xT.EnableAI(false)
    xC = Game.GetPlayer()
    ObjectReference XPlayPos = xC.PlaceAtMe(XMarker)
    Actor xA = MindXMarkerREF.PlaceAtMe(xT.GetBaseObject()) AS Actor
    xA.BlockActivation()
    xA.RemoveAllItems()
    xA.RemoveFromAllFactions()
    Int iC = xT.GetNumItems()
    WHILE iC
        Form xF = xT.GetNthForm(iC)
        IF xT.IsEquipped(xF)
            xA.AddItem(xF, 99)
            xA.EquipItem(xF, true)
        ENDIF
        iC -= 1
    ENDWHILE
    xC.MoveTo(MindXMarkerREF)
    xA.AddSpell(GhostAbility)
    xC.AddSpell(GhostAbility, false)
    xA.StartCombat(xC)
    WHILE !xA.IsDead() && iC < 60 ; Минута на бой.
        Utility.Wait(1.0)
        iC += 1
    ENDWHILE
    iC = xA.IsDead() AS Int
    xC.RemoveSpell(GhostAbility)
    xC.MoveTo(XPlayPos)
    XPlayPos.Delete()
    xA.Disable()
    xA.Delete()
    xT.SetGhost(false)
    xT.BlockActivation(false)
    xT.EnableAI()
    xT.PushActorAway(xT, 0.0)
    IF iC
        Utility.Wait(0.5)
        xT.AddSpell(MG08ParalysisAbility)
            ; для НПС - после выгрузки локации маг. эффект добавленных заклинаний типа Ability перестает работать (и его скрипт тоже), но само заклинание остается.
    ENDIF
ENDEVENT

Нарада  Offline  Сообщение №2530 написано: 11 сентября 2017, 07:47 | Отредактировано: Нарада - 11 сентября 2017, 07:50



129
Добрые сутки, друзья! У меня появился вопрос: можно ли программно, используя меню Message, открыть контейнер? Что-то я не нашел соответствующих функций.

Dsion  Offline  Сообщение №2531 написано: 11 сентября 2017, 09:17



Нарада, да просто активируй его. Работает даже если контейнер на другом конце мира.

maxcad  Offline  Сообщение №2532 написано: 17 сентября 2017, 05:34



2
Добрый день.
У меня может несколько странный вопрос.
В папирусе есть функции обработки строк? Такие как
Чтение вхождения строки, это значит например прочитать строку со 2 по 5 символ
Перезаписать строку/часть строки с такогото по такойто символ.

Можно ли создавать многоуровневые массивы? Это значит массив в массиве. Ну или  сделать такой массив, чтобы его элементы были массивами?

Dsion  Offline  Сообщение №2533 написано: 17 сентября 2017, 07:50 | Отредактировано: Dsion - 17 сентября 2017, 07:52



maxcad, вопрос как вопрос...
Кое-какие функции для работы со строкой есть, но только в SKSE:
https://www.creationkit.com/index.php?title=StringUtil_Script

Многомерные массивы - нормального способа нету. Можно симулировать многомерный массив с помощью одномерного или использовать объекты. Вот тут написано:
https://www.creationkit.com/index.php?title=Arrays_(Papyrus)
(в разделе "Multi-Dimensional Arrays")

Иногда еще подходит решение c массивом из FormList.

maxcad  Offline  Сообщение №2534 написано: 17 сентября 2017, 17:16 | Отредактировано: maxcad - 17 сентября 2017, 17:17



2
Как  получить  свойства брони/одежды?
Слоты на которые она одевается Biped Objects
И её ID который на картинке. Не шестнадцатиричный код.

MrJygalag  Offline  Сообщение №2535 написано: 16 октября 2017, 13:08



2
Вопрос - как мне сделать скрипт, что отключал бы цель после определённого этапа квеста?

Lexo  Offline  Сообщение №2536 написано: 21 октября 2017, 17:08 | Отредактировано: Lexo - 20 октября 2017, 16:13


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


223
maxcad, Слоты, по-моему, определяются СКСЕ... попробуй тут поискать...

Добавлено (20 Октября 2017, 19:11)
---------------------------------------------
Давно я сюда не обращался с просьбами... но у меня один вопрос, который я не могу решить... не могли бы вы подсказать?

Как заставить контейнер выкинуть всё его содержимое? Есть заклинание, которое складывает предметы в этот контейнер, и есть заклинание, которое должно заставлять этот контейнер всё это выблевать...

просто так у меня не получилось... попробовал сделать с помощью формлиста - заклинание, которое убирает предметы, добавляет их и в сундук и в формлист (ясень пень, что туда добавляются не рефы, а формы, от того он и ФОРМлист). Скрипт высвобождения ящика запускает формлист и каждый раз заставляет ящик выкидывать предмет... но ничего не выкидывается... что я делаю не так?

Что интересно, всё компилируется, как ни странно... но не работает


Помогите, пожалуйста...

Добавлено (20 Октября 2017, 20:21)
---------------------------------------------
Может, использовать невидимого персонажа, вместо контейнера?

Добавлено (21 Октября 2017, 20:08)
---------------------------------------------
Актёр не помог....


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

Dsion  Offline  Сообщение №2537 написано: 21 октября 2017, 17:31 | Отредактировано: Dsion - 21 октября 2017, 17:35



Lexo, сундуку обязательно быть именно контейнером? Можно создать отдельную локацию (Cell) и телепортировать туда вещи. А потом телепортировать их к сундуку. Потому что если их складировать в настоящий контейнер, то референсы потеряются.

Lexo  Offline  Сообщение №2538 написано: 22 октября 2017, 15:48


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


223
А если я одновременно несколько предметов? Скрипт сможет десятки разных предметов (книги, камни душ, доспехи) складывать в одном месте, а потом телепортировать в другое?

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

Dsion  Offline  Сообщение №2539 написано: 22 октября 2017, 16:59



Если придумаешь, как передать скрипту id референса предмета.

Multigone  Offline  Сообщение №2540 написано: 22 октября 2017, 17:36



832
Dsion, если забивать массив одновременно несколькими переменными, половину можно потерять по пути. Вот что есть в Cell:


Код
; SKSE additions built 2015-05-24 00:46:48.937000 UTC
; Returns the number of refs in the cell
int Function GetNumRefs(int formTypeFilter = 0) native

; returns the ref at the specified index
ObjectReference Function GetNthRef(int n, int formTypeFilter = 0) native

Dsion  Offline  Сообщение №2541 написано: 22 октября 2017, 17:59



Multigone, воще не понял, о чем ты и причем тут я...
Если бы Lexo объяснил, как именно хочет отправлять вещи "в сундук", можно было бы что-то подумать... А так...
Будем тут месяц обсуждать, а потом окажется, что ему обычное RemoveAllItems подходит...

Multigone  Offline  Сообщение №2542 написано: 22 октября 2017, 21:30



832
Dsion, нужно ведь запоминать референсы предметов где-то, чтобы их потом когда-нибудь возвращать обратно из локации, так? Вместо этого можно просто "узнавать" их RefID с помощью SKSE. Я это хотел сказать.

Lexo  Offline  Сообщение №2543 написано: 23 октября 2017, 16:15


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


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

Добавлено (23 Октября 2017, 19:15)
---------------------------------------------
А может знаете способ нормально скриптом проходить через дверь, которая ведёт в другую локацию? OnActivate работает, но как-то не всегда так, как надо... активацию дверей делал через квест...


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

Dsion  Offline  Сообщение №2544 написано: 23 октября 2017, 17:33



Lexo, каким, блин, заклинанием? Заклинания не накладываются на неживые предметы. Если объяснишь, как оно у тебя работает, придумаем, как сделать выплевываение.

Lexo  Offline  Сообщение №2545 написано: 24 октября 2017, 05:18


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


223
Через квест...


тут прописано для Ammo, но у меня там несколько алиасов - для каждого вида предметов.

В квесте стоит скрипт из коментария выше

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

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

Dsion  Offline  Сообщение №2546 написано: 24 октября 2017, 09:15 | Отредактировано: Dsion - 24 октября 2017, 09:18



Lexo, мне три варианта на ум приходит:
1. Телепортировать вещи на маркер в отдельную локацию. Игрок туда никогда не зайдет, физика не включится. А потом можно телепортировать обратно.
2. Складывать вещи в контейнер и повесить на него ивент OnItemRemoved. Когда нужно выплюнуть вещи, вызываем на контейнере RemoveAllItems. Для каждого предмета (или стака) будет вызываться OnItemRemoved. А в OnItemRemoved можно создавать такие же предметы вокруг сундука. Но тут проблема в том, что это будут именно копии базового предмета. Не сохранятся улучшения, заряды камней душ итп.
3. Можно засовывать вещи в алиас перед помещением в сундук. Будет ограничение на количество предметов (по количеству алиасов), но остальные проблемы решатся.

Lexo  Offline  Сообщение №2547 написано: 24 октября 2017, 16:09


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


223
Цитата Dsion

А потом можно телепортировать обратно


Вот как сделать обратно, можно по-подробнее?

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

Dsion  Offline  Сообщение №2548 написано: 24 октября 2017, 18:57



Lexo, просто MoveTo - это перемещает один референс к другому референсу. А, ладно, пофиг.!

Lexo  Offline  Сообщение №2549 написано: 28 октября 2017, 15:00


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


223
Про муфту я знаю... а как сделать это тем способом:
Цитата Dsion

Телепортировать вещи на маркер в отдельную локацию

вот это я не пойму...

Добавлено (28 Октября 2017, 18:00)
---------------------------------------------
Точнее, как перенести с маркера ВСЕ предметы в другое место?..


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

Dsion  Offline  Сообщение №2550 написано: 28 октября 2017, 15:11



Lexo, по формлисту, конечно! Или так, как Multigone писал.

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





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