Модератор форума: 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  Сообщение №1741 написано: 22 июня 2015, 13:29



832
nepewka, сделай плащ - Ability, в Effect List для основного эффекта укажи условие:

(S) (GetEquipped) (MyItem) (==) (1.0) (AND)

Дать плащ нужному НПС. Если НПС один, а не рандомные, то в этом случае можно обойтись без скриптов.

nepewka  Offline  Сообщение №1742 написано: 22 июня 2015, 15:31 | Отредактировано: nepewka - 22 июня 2015, 15:32



255
Multigone, ну это самый простой вариант, а мне интересен именно динамичный способ по ходу игры. Я хочу сделать по примеру эбонитовой кольчуги, там зачарование + скрипт в самом предмете при надевании an akactor.addspell. Там в принципе ничего сложного, на основе этого я и хочу сделать кольцо. Просто интересно, есть ли техническая возможность такого для нпц..? Чтобы понять о чем я говорю, посмотри пожалуйста в CK Skyrim.esm Эбонитовая кольчуга, называется предмет. Просто, раз ты говоришь, что функция addspell работает для нпц, то и это должно работать :)

Dsion  Offline  Сообщение №1743 написано: 22 июня 2015, 15:32



А я по опыту добавления скриптом пассивных абилити NPC могу сказать, что нихрена она у них не остается даже если просто покинуть локацию, а потом вернуться.
Но, может, это именно с Ability так. Я не сильно проверял.

Multigone  Offline  Сообщение №1744 написано: 22 июня 2015, 15:36



832
nepewka, не вижу никаких препятствий, чтобы скриптом давать НПС Spell / Ability при надевании предмета и удалять при снятии.

Dsion  Offline  Сообщение №1745 написано: 22 июня 2015, 16:08



Ладно-ладно. Только не говорите потом, что я не предупреждал... Хехехе.

Я это проверял, когда делал модик с оглушением. Сначала сделал просто накладывающийся на NPC эффект, но эффект тут же моментально спадает со всех NPC в локации, когда игрок эту локацию покидает и она выгружается.

Потом хотел добавлять NPC скриптом пассивную абилити. Но они и её сразу теряют, когда выгружаются (OnUnload).

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

Multigone  Offline  Сообщение №1746 написано: 22 июня 2015, 16:13



832
Dsion, проверю на OnUnload и отпишусь.

Dsion  Offline  Сообщение №1747 написано: 22 июня 2015, 16:25



Попробуй так:
1. Выбрать любого NPC на площади Вайтрана и через консоль добавить ему абилити: addspell 5030b
2. Убедиться, что он стал крутым полупрозрачным духом.
3. Выйти из города через главные ворота и сразу зайти обратно.
4. Убедиться, что NPC вернулся в ряды живых.

nepewka  Offline  Сообщение №1748 написано: 22 июня 2015, 16:39



255
Dsion, консоль ни есть хорошо. Почему мой метод с предметом хорош? Да потому что, даже если Dsion прав и выданные по ходу игры spell'ы и ability спадают - скриптовым предметом и эвентом onequip они всегда будут раздаваться снова при появлении рядом игрока, разве не так Multigone?

Dsion  Offline  Сообщение №1749 написано: 22 июня 2015, 17:04 | Отредактировано: Dsion - 22 июня 2015, 17:06



Разумеется, не так.
Будет работать только если ты добавишь предмет в Outfit. Тогда NPC будет надевать его каждый раз во время загрузки и получать свою абилку.
Если же просто наденешь на него кольцо, то он его снимет во время OnUnload. А если наденешь кольцо с флагом "не снимать", то он его не снимет, но магический эффект с него все-равно спадет после выгрузки и больше не повесится во время загрузки.

Ладно, разбирайтесь. По-моему, чтоб называть какой-то метод "хорошим" надо чтоб он сначала заработал...

Multigone  Offline  Сообщение №1750 написано: 22 июня 2015, 17:19 | Отредактировано: Multigone - 22 июня 2015, 17:41



832
Dsion, в общем, результаты: наложенное заклинание или выданное абилити после выгрузки НПС завершают работу своих MGEF (т.е. срабатывает OnEffectFinish()). При загрузке НПС в мир MGEF не начинают свою работу снова, однако абилити проходит проверку HasSpell() (для заклинания не знаю, чем проверить его наличие, кроме как через маг. эффект, исчезающий после выгрузки).

В случае, описанном Dsion'ом, я бы сделал на игроке апдейт с кастом др. заклинания большой площадью (игнорируя преграды), которое проверяет наличие абилити и отсутствие эффекта абилити. Если проверка пройдена, абилити накладывается снова. Пока все, что придумал.

Есть еще вариант помещать НПС в алиасы, на которых события OnLoad() и OnUnload(), но он оч. громоздкий и для конечного числа целей.

UPD: Короче, я заколебался искать косяки там, где их не должно быть.

nepewka  Offline  Сообщение №1751 написано: 22 июня 2015, 17:40



255
Multigone, щас не понял. Даже если я сделаю outfit с нужными мне зачарованными и заскриптованными кольцами, заклинания все равно будут спадать ??? А ты говорил не видишь препятствий) ) и что ещё за повторная загрузка? Не пойму

Multigone  Offline  Сообщение №1752 написано: 22 июня 2015, 17:44



832
nepewka,

Цитата nepewka

А ты говорил не видишь препятствий

На момент написания комментария я не видел препятствий, т.к. не знал о них.

Dsion  Offline  Сообщение №1753 написано: 22 июня 2015, 18:01



А чего просто не повесить спелл на атронаха? Или на копию.
Если нужно, чтоб он не всегда работал, ввести еще глобальную переменную.

SoraSt  Offline  Сообщение №1754 написано: 22 июня 2015, 18:09



21
Multigone, запустить скрипт с активатора мне удалось. Для теста. Но вот с квеста не получается. Распиши пожалуйста поподробней как это сделать. Чтобы предмет появлялся по завершению квеста. А то у меня либо он не срабатывает, либо выдает ошибку компиляции.

nepewka  Offline  Сообщение №1755 написано: 22 июня 2015, 18:14



255
Multigone, значит вся проблема в том, что при выгрузке нпц он загружает стандартный outfit и если там нету нашего кольца, соответственно никакой абилки не будет.? Окей, ну хотя бы через outfit работает.

Добавлено (22 Июня 2015, 21:14)
---------------------------------------------
Dsion, хочу чтобы предметы имели больше импакта в игре, в морровинде вот предметы имеют активные заклинания, здесь же только зачарования. Их доработать и с constant плащами они будут почти как заклинания) )


Multigone  Offline  Сообщение №1756 написано: 22 июня 2015, 20:19



832
nepewka, даже не знаю. Попробуй через него. К тому же Outfit можно менять скриптом, т.е. по сути, выдавать абилити случайным актерам.

nepewka  Offline  Сообщение №1757 написано: 22 июня 2015, 20:47



255
Multigone, ну я к тому, что как говорит Dsion, если изначально в ките настроить outfit то всё с абилити будет работать нормально? ?

Dsion  Offline  Сообщение №1758 написано: 22 июня 2015, 20:58 | Отредактировано: Multigone - 27 апреля 2020, 17:17



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

Ну, вернее, способов на ум дофига приходит, но все с недостатками...

Multigone  Offline  Сообщение №1759 написано: 22 июня 2015, 21:05



832
Dsion, ты ж говорил, можно ее восстановить. Да и я предложил вариант.

nepewka  Offline  Сообщение №1760 написано: 22 июня 2015, 23:50 | Отредактировано: nepewka - 22 июня 2015, 23:53



255
Так, ребята. Прочитав ещё раз наш диалог от
начала и до конца пришел к выводу, что придется отказаться от динамичного добавления актерам spell'ов и ability. Слишком уж геморойно это, хотя от идеи добавления плаща от предмета все же не откажусь. Не побрезгую тем, что придется использовать CK. Тем более я хочу добавить такие предметы всего лишь нескольким актерам через созданный мною outfit. (Dsion, стандартные outfit'ы трогать не буду) Главное чтобы это работало. Ну а с другой стороны, почему работать не будет?? Вы говорите проблема при выгрузке, но если при выгрузке он загружает наш outfit с заскриптованным кольцом, то и проблем не должно быть, ведь так? Хотя с другой стороны многое зависит от того, как работает событие event OnEquipped, если оно каждый раз будет срабатывать при выгрузке нпц и выдавать ему ability то ок. Или же оно срабатывает при появлении игрока? Не важно, главное чтобы оно не зависло и не перестало выдавать ability

SoraSt  Offline  Сообщение №1761 написано: 23 июня 2015, 09:51



21
Multigone, все сделал по пунктам. Но при попытке компиляции в окне  "Papyrus Fragment" выдает две ошибки.
variable MyREFR is undefined
none is not a known user-defined type

Multigone  Offline  Сообщение №1762 написано: 23 июня 2015, 13:02



832
SoraSt, в общем, теперь по-другому:

1) Открой квест, нужную стадию, щелкни Log Entry.
2) Скопируй в окно:

Debug.Notification("")

3) Перейди во вкладку квеста Scripts. Там появится скрипт с названием QF_(Editor ID квеста)_(Form ID квеста).
4) Нажми ОК в самом квесте (т.к. сперва скрипт не может показать исходник и кнопку Add Property).
5) Открой заново этот квест и ЛКМх2 по созданному скрипту.
6) Нажми кнопку Add Property.
7) В появившемся окне выбери тип переменной (ObjectReference) и введи ее имя (MyREFR). ОК.
8) Перейди во вкладку стадий квеста, выбери нужную стадию, щелкни Log Entry.
9) Сотри написанное и скопируй туда:

MyREFR.Enable()

10) Перейди во вкладку квеста Scripts (чтобы скрипт скомпилировался снова). Нажми кнопку ОК квеста.
11) Открой квест и проверь исходник. Он должен представлять из себя такую... не знаю, как еще это назвать, шнягу.

12) Открой Property скрипта и для MyREFR укажи конкретный объект в окне рендера.

Вроде все. Алгоритма с меньшим кол-вом действий я пока не нашел.

Arin  Offline  Сообщение №1763 написано: 24 июня 2015, 04:14



570
Господа, у меня любопытный вопрос. Так получилось, что я делаю собаке в модах пакет, который приказывал ей перемещаться из дома во двор и обратно. Разрешение на использование дверей стоит на расе, но, судя по всему, разрабы не придумали анимации открытия дверей для собаки, поэтому, когда она "переходит" на глазах игрока, то просто зависает перед дверью, так как не срабатывает анимация (которой нет...). Вопрос, можно ли сделать так, чтобы при попытке активировать дверь, собака просто телепортировалась в нужное место (перед другой дверью соотвественно)?

Наука всегда оказывается не права. Она не в состоянии решить ни одного вопроса, не поставив при этом десятка новых.
Джордж Бернард Шоу
Multigone  Offline  Сообщение №1764 написано: 24 июня 2015, 07:27 | Отредактировано: Multigone - 24 июня 2015, 07:29



832
Arin,



nepewka  Offline  Сообщение №1765 написано: 25 июня 2015, 17:50 | Отредактировано: Multigone - 27 апреля 2020, 17:02



255
Multigone, помнишь, наш товарищ AlexTirex написал вот такой прекрасный скрипт на неограниченное кол-во здоровье у актеров: (как его адаптировать под игрока?)

Скрипт вешается на Алдуина (тип Actor) или на алиас с Алдуином (тогда добавить GetActorRef()):

Код
int iNext
  
Event OnCombatStateChanged(Actor akTarget, int aeCombatState)
  if aeCombatState == 1 && akTarget == Game.GetPlayer()
    StartDeferredKill()
    RegisterForSingleUpdate(1.0)
  elseif aeCombatState == 0
    UnregisterForUpdate()
    ResetHealthAndLimbs()
    if iNext == 0
      EndDeferredKill()
    endif
    iNext = 0
  endif
endEvent
  
Event OnUpdate()   
  if GetAV("Health") <= 0
    if iNext == 2
      EndDeferredKill()
      UnregisterForUpdate()
      return
    else
      iNext += 1
      RestoreAV("Health", GetBaseAV("Health"))
    endif
  endif
  RegisterForSingleUpdate(1.0)
endEvent

Dsion  Offline  Сообщение №1766 написано: 25 июня 2015, 18:05



А просто сделать абилку, которая повышает ХП на 1000000 и дает регенерацию 1000000 ХП в секунду нельзя что-ли?

Multigone  Offline  Сообщение №1767 написано: 25 июня 2015, 20:01 | Отредактировано: Multigone - 25 июня 2015, 20:46



832
nepewka, для игрока нужно только изменить эту строчку:

Код
if aeCombatState == 1 ; && akTarget == Game.GetPlayer()
PS: Мне этот скрипт не нравится. Наверное, я бы сделал его с OnHit() и возможностью устанавливать актеру произвольные значения здоровья.

Dsion, если полистать тему, можно найти сообщение AlexTirex, где он говорит об ограничении здоровья любых актеров величиной 5000. Но я не проверял.

Цитата Dsion

сделать абилку

Или дать актеру ванильный перк InvulnerableActorZeroIncomingDamage. Или IsGhost в ActorBase.

nepewka  Offline  Сообщение №1768 написано: 25 июня 2015, 21:46 | Отредактировано: nepewka - 25 июня 2015, 22:32



255
Multigone,  есть такое дружище, после долгих тестов заметил, что после 10к хп замечаются неоднократные баги в получении урона. Поэтому и нужен скрипт

Добавлено (26 Июня 2015, 00:44)
---------------------------------------------
просто после превышения actor value health points 10000 вычисления здоровья производятся неправильно, поэтому надо сделать скрипт 10 тысяч по несколько раз, чтобы это работало нормально

Dsion  Offline  Сообщение №1769 написано: 25 июня 2015, 23:31



100% ресист к любому урону точно не походит? Или 99.9% и 1000 хп/сек реген?
Ну как хочешь... Хотя скрипт какой-то диковатый...

nepewka  Offline  Сообщение №1770 написано: 26 июня 2015, 15:24



255
Multigone
Цитата Multigone

nepewka, для игрока нужно только изменить эту строчку: 

Кодif aeCombatState == 1 ; && akTarget == Game.GetPlayer()


изменить, всмысле лучше вообще убрать? Мне вот akTarget здесь вообще не нравится, цель которая наносит урон может быть любой от монстра1 до монстра5.

А вам что в скрипте не нравится? Deffered kill помоему крутая штука

Добавлено (26 Июня 2015, 18:24)
---------------------------------------------
кстати, через что лучше вешать скрипт, через вкладку Actors на конкретного актёра или же на референс актёра через квест с автостартом?


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





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