Модератор форума: 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? Пиши не в ЛС, а в эту тему.
MemoriaVetusta  Offline  Сообщение №961 написано: 18 апреля 2014, 15:12 | Отредактировано: MemoriaVetusta - 18 апреля 2014, 15:20



173
LordVadim, возможно, для Projectile нужно указать слой столкновений (Collision Layer)... только какой? Может быть, это "L_LIVING_AND_DEAD_ACTORS"? Но тогда снаряд будет пролетать через все остальное... если не создать новый слой столкновений, где указать, с какими слоями может сталкиваться снаряд.

Nothing is...
AveDarkness  Offline  Сообщение №962 написано: 18 апреля 2014, 15:35



9
Возможно ли реализовать такое?
Чтобы при переключении стадии, появлялся предмет в рандомных местах(например: может на столе появиться, а может на полу или полке).

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



139
Цитата MemoriaVetusta

возможно, для Projectile нужно указать слой столкновений (Collision Layer)... только какой? Может быть, это "L_LIVING_AND_DEAD_ACTORS"?


Не срабатывает. Снаряд все равно пролетает НПС насквозь.

MemoriaVetusta  Offline  Сообщение №964 написано: 18 апреля 2014, 18:51 | Отредактировано: MemoriaVetusta - 18 апреля 2014, 18:55



173
LordVadim, а как должно действовать заклинание? У меня есть идея... некая.

Nothing is...
LordVadim  Offline  Сообщение №965 написано: 18 апреля 2014, 18:57



139
Цитата MemoriaVetusta

LordVadim, а как должно действовать заклинание? У меня есть идея... некая.


Суть в следующем: ГГ выпускает по НПС заклинание на цель. У НПС включено свойство Ghost и заклинание пролетает мимо. А мне нужно получить референс этого НПС.
Как это сделать не отключая свойство Ghost?

MemoriaVetusta  Offline  Сообщение №966 написано: 18 апреля 2014, 19:13 | Отредактировано: MemoriaVetusta - 18 апреля 2014, 19:24



173
LordVadim, может, вместо Aim попробовать Target Actor? Тогда надо указывать Explosion, а не Projectile. Правда, неизвестно, будет ли призрак считаться целевым актером, если, согласно описанию флага Is Ghost, "не действуют эффекты попадания и события попадания".

Хм... а ты не пробовал с L_COLLISIONBOX? В описании слоя говорится, что задает слои столкновения для фантомов.

Nothing is...
LordVadim  Offline  Сообщение №967 написано: 18 апреля 2014, 19:32



139
Цитата MemoriaVetusta

LordVadim, может, вместо Aim попробовать Target Actor? Тогда надо указывать Explosion, а не Projectile. Правда, неизвестно, будет ли призрак считаться целевым актером, если, согласно описанию флага Is Ghost, "не действуют эффекты попадания и события попадания". Хм... а ты не пробовал с L_COLLISIONBOX? В описании слоя говорится, что задает слои столкновения для фантомов.


Не срабатывает.

MemoriaVetusta  Offline  Сообщение №968 написано: 18 апреля 2014, 19:37 | Отредактировано: MemoriaVetusta - 18 апреля 2014, 19:41



173
LordVadim, если надо любой ценой узнать референс, можно задать активацию заклинания "на себя". У меня идеи кончились. Одно ясно: если снаряд никак не заставить попасть в НПС, значит, вся идея с айм-заклинанием гибнет на корню.

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

Nothing is...
LordVadim  Offline  Сообщение №969 написано: 18 апреля 2014, 19:43 | Отредактировано: LordVadim - 18 апреля 2014, 19:46



139
Цитата MemoriaVetusta

если снаряд никак не заставить попасть в НПС, значит, вся идея с айм-заклинанием гибнет на корню.


Заставить то можно, сняв свойство Ghost, но когда поблизости от ГГ сотня НПС у которых надо снять свойство, то даже на моём, не слабом, компьютере эта процедура занимает 4 - 5 секунд.
Я надеялся найти другой способ.
Может AleksTirex что нибудь подскажет?

MemoriaVetusta  Offline  Сообщение №970 написано: 18 апреля 2014, 19:48 | Отредактировано: MemoriaVetusta - 18 апреля 2014, 19:52



173
LordVadim, если задать каст на себя, но взрывом искать актера со свойством Is Ghost, я это имел в виду... Мне кажется, предложенная альтернатива была бы хорошей идеей (т.е. под ноги НПС).

Nothing is...
LordVadim  Offline  Сообщение №971 написано: 18 апреля 2014, 19:51



139
Цитата MemoriaVetusta

LordVadim, если задать каст на себя, но взрывом искать актера со свойством Is Ghost, я это имел в виду...


Это сработало бы если бы НПС-призрак был бы один, а если их несколько и они стоят рядом друг с другом, а определить надо того, в которого целится ГГ...

MemoriaVetusta  Offline  Сообщение №972 написано: 18 апреля 2014, 19:52 | Отредактировано: MemoriaVetusta - 18 апреля 2014, 19:55



173
LordVadim, а, так ты же не сказал, что тысячи их... :) Все же, подумай над предложенной альтернативой, и еще мне кажется, что ты пишешь посты быстрее, чем я произвожу в своих редактирование... smile2

Nothing is...
LordVadim  Offline  Сообщение №973 написано: 18 апреля 2014, 20:08 | Отредактировано: LordVadim - 18 апреля 2014, 20:12



139
Цитата MemoriaVetusta

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


Да-к, азарт поиска решения...  :D
Попробую через OnGainLOS отключать свойство Ghost у целевых НПС, может так получится.

MemoriaVetusta  Offline  Сообщение №974 написано: 18 апреля 2014, 20:16



173
LordVadim, дабы задобрить суровых богов скриптов, я принесу в жертву пару .esp...

Nothing is...
сергей007788  Offline  Сообщение №975 написано: 19 апреля 2014, 07:55



76
У меня такой вопрос, если в скрипте ввести переменную, int X, Затем при определенных события присваивать этой переменной нужные значения. Будут ли эти значения стабильны, то есть, не обнулятся ли они при респауне.
К примеру. На нпк висит скрипт, ГГ подходит к нпк, активирует нпк и переменной Х, присваивается значение 5. далее гг покидает локацию, и через месяц возвращается, сохраниться ли это значение 5 или оно обнулится после респауна? Для моей задумки глобальная переменная не подходит и мне важно знать, как будет вести себя обычная переменная.

nepewka  Offline  Сообщение №976 написано: 19 апреля 2014, 09:33



255
сергей007788, смотря кем именно будет выступать у тебя переменная Х.  Восстанавливающиеся значение или нет.
Если нпц умрет, после респауна у него будут стандартные значения из Астоr, пока ты снова не активируешь скрипт

AleksTirex  Offline  Сообщение №977 написано: 19 апреля 2014, 10:15


Архимаг


371
Цитата сергей007788

У меня такой вопрос, если в скрипте ввести переменную, int X, Затем при определенных события присваивать этой переменной нужные значения. Будут ли эти значения стабильны, то есть, не обнулятся ли они при респауне.



При респауне объекта переменные в его скрипте обнулятся/сбросятся.
Если надо сохранить данные, то лучше их хранить в невыключаемом квесте.
 
************************
 
LordVadim, да, действительно, хоть снаряды и "разлетаются визуально" при попадании в призрака (Огненная стрела, Ледяной шип), но взрыв происходит только на объекте, где останавливается снаряд, и это не призрак. Я этого эффекта раньше не замечал, каюсь.
 
Тогда есть другой вариант, но только уточни, это твои призраки или неизвестные и рендомные? И как ты насчёт SKSE?
 
В общем, принцип такой: на НПС вешается абилка со скриптом, там событие OnHit(). На призраках абилки работают, хит тоже срабатывает (проверил в игре :) ). При касте ГГ и попадании в призрака срабатывает хит в абилке НПС, и дальше проверка на агрессора и тип снаряда (если надо), и далее - любое нужное действие.
Раздавать абилки можно в СК, если НПС твои, а если рендомные чужие, то динамически. Сама раздача тоже может быть по разному: или постоянное сканирование, или старт сканирования при экипировки магии (тут тоже есть разные способы).

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

AveDarkness  Offline  Сообщение №978 написано: 19 апреля 2014, 10:20



9
Цитата LordVadim

отправлять предмет к одному из них случайным образом.

Вот это меня и интересует, я просто не могу понять как.
Допустим у меня есть 4 яблока расположенных в игровом мире, но все они выключены(Initiality disabled).
Мне нужна функция которая будет енаблить одно из них случайным образом, при переключении стадии квеста.

LordVadim  Offline  Сообщение №979 написано: 19 апреля 2014, 12:18



139
Цитата AleksTirex

Удобнее всего это всё делать с SKSE, но можно и без него. Если принцип понятен и подходит, то пробуй, возникнут сложности - распишу подробнее, и сами скрипты тоже.


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

nepewka  Offline  Сообщение №980 написано: 19 апреля 2014, 12:41



255
AleksTirex, так что насчет перков. Нет идей?(

AleksTirex  Offline  Сообщение №981 написано: 19 апреля 2014, 13:37


Архимаг


371
LordVadim, если НПС твои, то всё упрощается - вешай скрипт с хит прямо на НПС.
 
*********************
 
nepewka, добавлять актёрам перки нельзя, замени действие перков маг.эффектами с похожими результатами. Мне сейчас совсем нет времени заняться вопросом перков, возможно, потом займусь.
 
**********************
 
AveDarkness, сделай свойство-массив, назначь в нём все свои яблоки, и рендомно включай одно из них:
 
ObjectReference[] Property akAple auto ; при создании свойства ставишь галочку Array и назначаешь все свои яблоки
 
В теле/окне стадии квеста пишешь эти команды:
 
int irandom = Utility.RandomInt(0, akAple.Length - 1)
akAple[irandom].Enable()


При срабатывании стадии включится одно произвольное яблоко.

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



255
AleksTirex, помоги пожалуйста с написанием скрипта.

Обьект - пассивная способность, с постоянным эффектом. Эта способность может быть как и у игрока, так и у нпц.

Цель - создать новый эффект, подобный стандартным эффектам уязвимости (Weakness), но который бы не затрагивал их.

Пример - актёр, владеющий этой пассивной способностью получает на 20% больше урона с любых заклинаний, которыми в него атакуют.
В нас кинули фаерболл на 40 урона, после срабатывания скрипта этой способности до нас дошло на 20% больше = 48 магнитуды.
Это хоть в теории возможно?

Может быть как то задействовать SetNthEffectMagnitude? Хотя он же работает только в тех эффектах, от которых сам исходит.
Понимаю, что реализовать будет очень тяжело из за массовости.
Была у меня идея создать формлист, закинуть туда все спеллы на которых это будет работать и сделать им всем SetNthEffectMagnitude *1.2, но это опять же будет работать только для тех спеллов, которые исходят от нас, плюс противоречит работе уязвимости, которая должна быть на цели применения, а не на нас.
Но необязательно для всех спеллов, хотя бы для основных заклинаний школы разрушения он бы работал - было бы чудесно!

Заранее большое спасибо!

AleksTirex  Offline  Сообщение №983 написано: 19 апреля 2014, 22:05


Архимаг


371
Скрипт вешается в свою абилку.

Принцип: при попадании заклинания на НПС срабатывает OnHit(), в котором проверяется: попало именно заклинание, кастовал не сам НПС, враждебное, школа разрушения. Далее считывается кол-во эффектов и записывается магнитуда каждого эффекта в массив (10 - этого хватит, т.к. больше 10 эффектов не бывает). Далее каждый такой эффект получает магнитуду 20% от номинала. Когда все эффекты изменены НПС кастует этим спеллом сам на себя, т.к. после попадания на НПС заклинания его уже бесполезно изменять, а тут НПС кастует уже изменённым заклинанием. Потом все эффекты этого спелла взвращаем в исходное значение.

Получается второй каст заклинания с силой в 20% от исходного, что и требовалось.
Работает только на заклинания и оружие (посохи), зачарование, яды не действуют.
 
float[] aamagnitude
 
Event OnEffectStart(Actor akTarget, Actor akCaster)
  aamagnitude = new float[10]
endEvent

 
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
  Actor akSelf = GetTargetActor()
  if akSource as Spell && akAggressor as Actor != akSelf
    Spell akSpell = akSource as Spell
    if akSpell.IsHostile()
      int numEffects = akSpell.GetNumEffects()
      int index = 0
      While index < numEffects
        MagicEffect effect = akSpell.GetNthEffectMagicEffect(index)
        if effect.GetAssociatedSkill() == "Destruction"
          float magnitude = akSpell.GetNthEffectMagnitude(index)
          aamagnitude [index]= magnitude
          magnitude = magnitude * 0.2  ; ==20%
          akSpell.SetNthEffectMagnitude(index, magnitude)
        endif
        index += 1
      endWhile
      akSpell.Cast(akSelf, akSelf)
      Utility.Wait(0.2)
      index = 0
      While index < numEffects
        MagicEffect Reffect = akSpell.GetNthEffectMagicEffect(index)
        if Reffect.GetAssociatedSkill() == "Destruction"
          akSpell.SetNthEffectMagnitude(index, aamagnitude[index])
        endif
        index += 1
      endWhile
    endif
  endif
endEvent

 
*******************
В игре не проверял, но компилиться должно. (нужен SKSE)

nepewka  Offline  Сообщение №984 написано: 20 апреля 2014, 00:11 | Отредактировано: nepewka - 20 апреля 2014, 00:16



255
AleksTirex,  такс. Вообщем проверил все на работоспособность.

Создал Способность с постоянным эффектом на себя и Effect Archetype Script, повесил скрипт, закомпилировал.

В игре подошел к первому же попавшемуся стражнику и командой addspell добавил нашу абилку. Теперь самое интересное, как работал эффект:

Кастовал фаерболлы.

1. После попадания спелла в стражника: через 0.2сек Utility.Wait от стражника вбок или куда то внебо вылетает уже 2 фаерболла.(видимо мой обратно летит + тот фаерболл, которым он в себя должен был кастануть). То есть в себя он не кастует, плюс не совсем понятно откуда 2 каст у него берется ;)

2. Не работает Return магнитуды фаерболла.(Здесь большой вопрос работает ли он вообще для SetNthMagnitudeEffect) После моего первого каста, урон фаерболла становится 20% от начальных 40, тобишь 8.

Кастую ещё раз, становится 1. Третий уже - 0 и т.д.

Мои мысли, если надо))
Лично я думаю проблема в том, что непись неможет в себя кастануть спелл у которого направленность Fire and Forget - цель.
Я как то пробовал заставить непися кастануть фаерболл в себя, ещё когда химичил с .cast
Fireball.cast(akTarget, akTarget)
Как итог - ничего не срабатывало, пока я не сменил направленность - на себя.

AleksTirex  Offline  Сообщение №985 написано: 20 апреля 2014, 15:34


Архимаг


371
nepewka, возврат значений работает. Этот скрипт - шаблон для создания своего скрипта. Т.е. показан сам принцип, а дорабатывать его тебе надо самому.
 
При попадании в цель заклинания могут срабатывать несколько OnHit(), и поэтому второй просто переписывает значения в массиве на уже изменённые (маленькие). Для подобных обработок надо вводить "заглушку", или переменной, или статусом, чтобы пока полностью не отработает один блок, второй бы не смог работать/обрабатывать.
Если введёшь такую заглушку, то всё будет правильно с магнитудой.
 
Далее думай над кастом. Возможно, попробуй создать под ногами НПС временный маркер и пусть он кастонёт по НПС. После каста сразу удаляешь этот маркер.
 
*************************
 
Вариант, как сделать простое "Уязвимость к магии" я не предлагаю, ведь если я правильно тебя понял, то тебе нужен процесс создания, а не сам результат. Поэтому играйся с новыми идеями, я лишь подскажу сами идеи, а уж реализовывать их надо тебе самому.  :)

nepewka  Offline  Сообщение №986 написано: 20 апреля 2014, 17:14



255
Цитата AleksTirex

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

 
За советы большое спасибо!!  ;) Буду пробовать различные варианты.

Кстати насчет простой Уязвимости. В одном из твоих старых постов на этом форуме(кстати хороший учебник  good ) ты писал, что используешь свои Association item, для которых как то создаешь все необходимые, различные эффекты. Не поделишься ли знаниями? :)
Уж очень меня заинтересовал этот пост.

AleksTirex  Offline  Сообщение №987 написано: 20 апреля 2014, 19:28


Архимаг


371
Цитата nepewka

ты писал, что используешь свои Association item, для которых как то создаешь все необходимые, различные эффекты



Не понял, приведи пример или ссылку.

nepewka  Offline  Сообщение №988 написано: 20 апреля 2014, 19:42



255
Цитата AleksTirex

Не понял, приведи пример или ссылку.


https://modgames.net/forum/1-9434-19#937536

AleksTirex  Offline  Сообщение №989 написано: 20 апреля 2014, 20:07


Архимаг


371
nepewka, так это было год назад. :)
Скорее всего, я говорил об архитектуре эффекта Cloak, вот в этом варианте я добавляю нужный спелл, который надо повесть на близкого актёра, т.е. делаю как бы пассивный мониторинг близкого окружения НПС/ГГ. В том втором спелле свой эффект и свой скрипт (если надо), в моём варианте тот эффект отдавал референс актёра, который подходил ближе 170 ед.
Это хорошо тем, что нет скриптовых поисков, OnUpdate(), циклов и прочего, всё работает в дефолтном режиме.

nepewka  Offline  Сообщение №990 написано: 20 апреля 2014, 20:35



255
AleksTirex, понятно, спасибо! Я уж думал придумал какую то хитроумную схему по редактированию/влиянию на Actor Value  :D

Маркеры прям заинтриговали! Хочу ещё параллельно с ними разобраться, вижу в них большой потенциал))
Такой вот вопрос:
Какой маркер можно взять, самый простой такой для использования под ногами нпц для спеллкастов? Можно какой нибудь бейсик скрипт увидеть для примера, самый что ни на есть простой?)
Допустим где на каст ГГ, под ногами таргета образуется маркер, который кастует 2 фаерболла в цель  :)
(отдельно хотелось бы узнать как маркер определяет референс цели ?)

===========================

ещё 3 вопросика простых хотел давно спросить у вас))

Чем вот такая вот
Function DoCombatSpellApply( Spell akSpell, ObjectReference akTarget ) native
функция отличается от привычной SpellCast?

===

Можно ли в редакторе создать перк, который будет работать для всех? (Хочу таким образом обойти ограничение на динамичное добавление перкам актерам в игре. Создав его в редакторе заранее, но так чтобы работал на всех)
А затем уже контролировать посредством Condition/Глобалок его влияние.
Просто можно или нет так сделать?

===

Как хорошо ты знаком со вкладкой Gameplay > Settings. Есть ли там что то, что может влиять на урон спеллов? Помимо настроек игровой сложности, которые увеличивают урон от героя к нпц и обратно, с ними я уже знаком))

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





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