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

Вопросы по скриптам Papyrus
sansuli  Offline  Сообщение №1 написано: 31 Август 2012, 17:29 | Отредактировано: Multigone - 23 Апрель 2020, 17:24


The Red Sun


193
Уроки по скриптованию на языке Papyrus
Прежде чем задать вопрос просмотрите вышеуказанные уроки.
ok


Тема регламентирована.


• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней.
• Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней.
• При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС.
• При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "
+" полезного сообщения.

Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
yakor77  Offline  Сообщение №3001 написано: 7 Декабрь 2020, 00:23 | Отредактировано: yakor77 - 7 Декабрь 2020, 00:29



28
Фродо01, идея красивая, свежая, но... опасная. Если в Скайриме начнется эпидемия, и все жители станут вампирами, будет очень плохо. Вводя яд, сразу надо готовить и противоядие. Подумайте, какой должна быть магическая вакцина, антивампирская прививка, чтобы эпидемию остановить и погасить. И соотв. квест от ярлов к Довакину. Да, и переболевшим и выздоровшим хорошо бы добавить какой-нибудь полезный вампирский перк. Остаточный и слабенький. Например, ночное зрение на 1 чвс. Повышенную сопротивляемость к ядам, болезням, холоду... ну, что-нибудь этакое.

С уважением.
Маг Иридий.
CYNIC78  Offline  Сообщение №3002 написано: 7 Декабрь 2020, 18:39 | Отредактировано: CYNIC78 - 7 Декабрь 2020, 19:04



5
Здравствуйте. Вопрос к знатокам папируса и CK.
У меня есть кастом раса и мне нужно сделать так чтоб на ней НЕ работали все эффекты восстановления здоровья - restore health, включая эффекты восстановления при помощи зельев. По задумке мода игрок должен восстанавливаться через команду Game.GetPlayer().ResetHealthAndLimbs(). Скрипт повешен на объекты, при активации которых происходит полное восстановления здоровья.
Как блокировать восстановление здоровья ванильными способами (с помощью магии восстановления и зелий) наиболее эффективно и надежно? Самый тупой способ, до которого я пока додумался это добавить в creation kit к соответствующим магическим эффектам условие, при котором эффект не срабатывает если у персонажа есть кейворд моей кастомной расы. При наличие данного условия все работает как надо - эффекты не срабатывают на моей расе, но тут же возникает проблема - если после моего мода будет загружен любой мод, меняющий магические эффекты зелий или соответствующих заклинаний восстановления, то, естественно, у них не будет данного условия и моя фича перестанет работать. Значит, нужно найти другой способ, например добавить к моей расе абилку, которая должна проверять и блокировать все эффекты восстановления здоровья, которые применяются на игроке во время игры. Но как это сделать по проще и понадежнее? Или может есть другой способ, например, через скрипты? Заранее спасибо.

Dsion  Offline  Сообщение №3003 написано: 7 Декабрь 2020, 19:09 | Отредактировано: Dsion - 7 Декабрь 2020, 19:10



CYNIC78, вроде, у перков есть entry point, позволяющая усилить или ослабить силу входящих заклинаний. Можно попробовать умножить силу заклинаний с кевордом хила на ноль. Хотя это я так - сам не проверял.
Но менять эффекты - точно лажа.

Multigone  Offline  Сообщение №3004 написано: 7 Декабрь 2020, 22:10 | Отредактировано: Multigone - 7 Декабрь 2020, 22:30



724
frodo01, вроде в Better Vampires это уже реализовано (заражение).

CYNIC78, есть моды, где здоровье добавляется скриптами (SomeActor.RestoreAV("Health", 10.0)). С этим-то что будешь делать? Еще здоровье меняется, если надевается шмот с бустом максимума здоровья (в этот момент к текущему здоровью прибавляется величина, равная бусту. То же самое происходит, если менять макс. здоровья командой ModAV). И с этим?
Я к тому, что, если озаботиться вопросами совместимости, то надо предусмотреть как можно больше вещей, касающихся твой идеи.

CYNIC78  Offline  Сообщение №3005 написано: 7 Декабрь 2020, 23:53



5
Цитата Dsion

CYNIC78, вроде, у перков есть entry point, позволяющая усилить или ослабить силу входящих заклинаний. Можно попробовать умножить силу заклинаний с кевордом хила на ноль. Хотя это я так - сам не проверял.Но менять эффекты - точно лажа.


Спасибо за подсказку. Попробую сделать через перки. Если все получится, то хотя бы ванильные эффекты будут отсечены. Надеюсь получится. Обязательно отпишусь о результатах.

CYNIC78  Offline  Сообщение №3006 написано: 8 Декабрь 2020, 04:46



5
Цитата Dsion

вроде, у перков есть entry point

Еще раз спасибо. Вобщем, сделал перк, добавил Multiplier 0.00 в условиях проставил все заклинания с ключевыми словами healing и все сработало. Единственно пришлось добавить абилку на расу и в скрипте прописать добавление нужного перка, другого способа добавления перка чето не нашел.

Myprism  Offline  Сообщение №3007 написано: 8 Декабрь 2020, 17:15


Физик


У меня очередной дурацкий затык. Так всегда бывает, когда долго не работаю со скриптами. Почему
Код
Scriptname _HDTPhysics extends ObjectReference
Event OnEquipped(Actor akActor)
Debug.MessageBox(Self.GetBaseObject() as Armor)
endEvent

Всегда сообщает "none"?
Речь идёт об экипировке шмотки, на которой висит данный скрипт, на левельном актёре при первой встрече его в игре. Да, если важно, то актёр изначально мёртв. Шмотка экипируется, поэтому и событие срабатывает. Шмотка на актёре отображается правильно, но почему её не распознаёт скрипт?

Multigone  Offline  Сообщение №3008 написано: 8 Декабрь 2020, 19:05 | Отредактировано: Multigone - 11 Февраль 2021, 16:21



724
Myprism, потому что предмет, находящийся в инвентаре, но не (находящийся в алиасе / попавший в инвентарь из мира), не имеет собственного RefID? Т.к. твой Self - это ObjectReference.
В таких случаях, если скрипт планируется добавлять к нескольким разным предметам (т.е. использовать как шаблон), создают несколько Property, но заполняют только какой-то один, и заполняют именно тем предметом, которому этот скрипт добавлен:
Код
Armor Property MyARMO Auto
Weapon Property MyWEAP Auto
MiscObject Property MyMISC Auto
...

Event OnEquipped(Actor akActor)
   IF MyARMO
      Debug.MessageBox(MyARMO)
   ELSEIF MyWEAP
      Debug.MessageBox(MyWEAP)
   ELSEIF MyMISC
      Debug.MessageBox(MyMISC)
   ...

endEvent

Еще можно поместить актера в алиас, и узнавать экипированный предмет через OnObjectEuipped().

grumpos  Offline  Сообщение №3009 написано: 2 Январь 2021, 22:32



24
Всех с наступившим! Нужна помощь со скриптом. Допустим, игрок подбирает Предмет. По умолчанию, этот Предмет оказывается в инвентаре игрока и исчезает из игрового мира. Как сделать так, чтобы Предмет оказался в инвентаре игрока, но не исчез из игрового мира, а отключился (Disable). А после того, как предмет удалится из инвентаря игрока, он вновь появился (Enable) там, откуда его взяли. Буду рад любой помощи.  :)

Myprism  Offline  Сообщение №3010 написано: 3 Январь 2021, 10:21


Физик


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

grumpos  Offline  Сообщение №3011 написано: 3 Январь 2021, 11:34



24
Приоткрою завесу тайны ) Предмет - это мыло. В игре это выглядит так: мыло лежит на тумбочке (не в контейнере!), игрок берет это мыло и идет в душ. По окончании процесса (анимация запускается только при наличии у игрока мыла) оно удаляется из инвентаря игрока и вновь появляется на тумбочке. Локация всегда одна - дом игрока. Как должен выглядеть скрипт в части появления мыла? Можно как-то вместо удаления переместить его из инвентаря на прежнее место?

Multigone  Offline  Сообщение №3012 написано: 3 Январь 2021, 11:49 | Отредактировано: Multigone - 8 Февраль 2021, 23:18



724
grumpos,

Код
; В скрипт, управляющий анимацией.

MiscObject Property MyItem Auto ; Мыло.
ObjectReference Property MyMarker Auto ; Референс Х-маркера (Static), заранее размещенный в положенном месте.

Event ???
   Game.GetPlayer().RemoveItem(MyItem, 999)
   MyMarker.PlaceAtMe(MyItem)
EndEvent

emelya8307  Offline  Сообщение №3013 написано: 3 Январь 2021, 17:22 | Отредактировано: Multigone - 8 Февраль 2021, 23:21



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

UPD: разобрался. На двери в локацию висел скрипт. Убрал скрипт с двери - актеры стали заходить, пакет заработал.

Myprism  Offline  Сообщение №3014 написано: 5 Январь 2021, 08:50


Физик


emelya8307, на некоторых дверях есть скрипты, которые запрещают проход всем, кроме ГГ.

emelya8307  Offline  Сообщение №3015 написано: 12 Январь 2021, 01:20 | Отредактировано: emelya8307 - 12 Январь 2021, 01:20



22
Скажите, пожалуйста, как получить день недели? Мне нужно, чтобы событие происходило регулярно в определенный день недели. (Сандас, например). Как игра это вычисляет? Единственное, что нашел, это глобальная переменная GameDaysPassed, количество дней с начала игры. Как из нее вычислить текущий день недели? Заранее, спасибо.
blush

yakor77  Offline  Сообщение №3016 написано: 12 Январь 2021, 12:53 | Отредактировано: Multigone - 12 Январь 2021, 19:17



28
Цитата emelya8307

количество дней с начала игры. Как из нее вычислить текущий день недели?

- арифметически. Каждый день недели закономерно повторяется через 7 дней. Значит, надо делить на 7, и смотреть остаток от деления. Математики в таких случаях говорят про "вычет по модулю 7". Погуглите, например, как строятся "вечные календари".

С уважением.
Маг Иридий.
Multigone  Offline  Сообщение №3017 написано: 12 Январь 2021, 20:10 | Отредактировано: Multigone - 12 Январь 2021, 22:17



724
emelya8307,
Получение дня недели:
Код
X = (GameDaysPassed.Value As Int + 6) % 7 + 1
Или: X = (Utility.GetCurrentGameTime() AS Int + 6) % 7 + 1

Где X - целое число от 1 до 7, соответствующее текущему дню недели, начиная с понедельника.

Если нужно задать время, когда должно происходить событие, можно использовать апдейт:

Код
Float fSomeDay = 3.25 ; Среда, 6 утра

FUNCTION Start()
   RegisterForSingleUpdateGameTime(fMod(fMod(fSomeDay, 7.0) - Utility.GetCurrentGameTime(), 7.0) * 168.0)
ENDFUNCTION

EVENT OnUpdateGameTime()
   Float fDaysWait = fMod(fMod(fSomeDay, 7.0) - Utility.GetCurrentGameTime(), 7.0) * 7.0
   IF fDaysWait < 0.01
      RegisterForSingleUpdateGameTime(168.0)
   ELSE
      RegisterForSingleUpdateGameTime(fDaysWait * 24.0)
   ENDIF
   ; Далее желаемые действия.
ENDEVENT

Float FUNCTION fMod(Float A, Float B = 1.0) ; Модуло.
    IF B
      RETURN A - Math.Floor(A / B) * B
    ENDIF
ENDFUNCTION

Kayo_Mara  Offline  Сообщение №3018 написано: 4 Февраль 2021, 14:57



1
Доброго времени суток. Кайо полный чайник в скриптах, но честно пыталась найти, как реализовать скрипт внутри диалога, который создавал бы переменную (или свойство, как я понимаю, лучше свойство, да?), а затем в дальнейших репликах диалога изменял бы её (банально путём добавления/вычитания числа), а сравнение этой переменной с фиксированными значениями открывало бы определённые ветки диалога.

Казалось бы, это не должно быть сложно, но Кайо не нашла толковых примеров объявления и изменения новых переменных/свойств в скриптовых окошках Begin/End настройки реплики, как и того, как засунуть итоговое значение в условие. Я попробовала ввести в поле End лишь единожды активируемой реплики такую фразу с объявлением переменной: "int property BLlevel = 1 auto" (где BLlevel - название моего свойства), нажала на компиляцию и получила триаду ошибок:

Понятия не имею, что не так, и как тогда надо. К тому же, если самый первый шаг ознаменовался таким фейлом, вангую, остальные части моего чайничевского плана заочно обречены на провал (Я планировала в остальных репликах прописывать просто BLlevel += 100 (или -=), а вот как использовать это в поле Conditions, и вовсе, по сути, пока не знаю, но подозреваю, что это можно как-то выкрутить через GetVMQuestVariable).

Объясните, пожалуйста, кто знает, как именно всё это использовать. Заочно благодарю за участие.

Multigone  Offline  Сообщение №3019 написано: 4 Февраль 2021, 20:43



724
Kayo_Mara, тут необходимые (но не достаточные) основы. Тут СК википедия.

По вопросу:
После создания нового квеста необходимо его сперва сохранить, чтобы получить возможность добавлять скрипты. Для одного квеста существует один автоматически создаваемый скрипт / исходник, в котором собраны все фрагменты его диалогов и стадий.
В пустом поле фрагмента TopicInfo написать:
Код
;
Сохранить TopicInfo. Скрипт с названием, соотв. FormID квеста, скомпилируется и появится возможность добавления переменных и дальнейшего редактирования текста фрагмента (в окнах Begin / End). Если ранее какие-то др. фрагменты в этом квесте уже компилировались, в скрипт / исходник будет добавлена только новая функция с названием Function Fragment_X() и текстом, соотв. тексту в поле фрагмента.
Добавить переменные (ПКМ меню скрипта). Сохранить квест.

Насчет использования переменных для проведения проверок в Conditions. Можно использовать глобальные переменные (GlobalVariable), можно через GetVMQuestVariable. Во втором случае скрипт должен иметь флаги Conditional в имени скрипта и имени переменной. Для такого лучше создать отдельный скрипт на квесте (с произвольным именем, например, MyQuestnameScript). Обращение к (Int) переменной MyVar скрипта MyQuestnameScript квеста MyQuestname из фрагмента, принадлежащего этому же квесту, производится способами:
Код
MyInt = (GetOwningQuest() AS MyQuestnameScript).MyVar
...
(GetOwningQuest() AS MyQuestnameScript).MyVar = 1;
(GetOwningQuest() AS MyQuestnameScript).MyVar += 1;
IF (GetOwningQuest() AS MyQuestnameScript).MyVar > 0
...
MyQuestnameScript MyTempScript = (GetOwningQuest() AS MyQuestnameScript)
   ; переменная с типом MyQuestnameScript и произвольным именем MyTempScript
MyTempScript.MyVar += 1

Если фрагмент не принадлежит квесту, переменной скрипта которого требуется управлять, то:
Код
Quest Property OtherQuest Auto

...
(OtherQuest AS OtherQuestnameScript).OtherVar += 1
...
OtherQuestnameScript MyTempScript = OtherQuest AS OtherQuestnameScript
MyTempScript.MyVar += 1

PS: Это уже раз 10 тут писалось (в той или иной форме).

emelya8307  Offline  Сообщение №3020 написано: 5 Февраль 2021, 21:32



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

Пока что на триггер бассейна прицепил скрипт:
Код
Event OnLoad()
    Self.Disable()
    Utility.Wait(0.15)
    Self.Enable()
End Event

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

Да, проще было бы удалять и экипировать полотенце при входе-выходе в триггер. Но сложность в том, что это рандомное полотенце, их несколько видов, и требуется, чтоб какое полотенце НПС снял при входе, то же самое он и надел при выходе.

Скрипт вот такой: (Подглядел в других модах, адаптировал под себя). Там используется формлист, в который занесены все полотенца.
Код
Scriptname aaaBathPoolScript extends ObjectReference
FormList Property aaaBathTowel Auto

Event OnTriggerEnter(ObjectReference triggerRef)
    Actor akactionRef = triggerRef as Actor
    Int i =0
    While i < aaaBathTowel.GetSize()
        Form MyForm = aaaBathTowel.GetAt(i)
        If (MyForm&& akActionRef.GetItemCount(MyForm)>0)
            akActionRef.UnequipItem(MyForm)
        Endif
        i+=1
    EndWhile
EndEvent

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

Multigone  Offline  Сообщение №3021 написано: 6 Февраль 2021, 02:33 | Отредактировано: Multigone - 11 Февраль 2021, 16:33



724
emelya8307, я бы сделал 2 сундука, первый на входе в локацию, в нем лежит куча разных полотенцев, второй около бассейна, пустой. Когда НПС входит в локацию, он берет случайный полотенец из первого, когда входит в триггер, полотенец из его инвентаря перемещается во второй. Когда покидает триггер, берет случайный полотенец из второго. Если игрок крадет полотенцы из второго, идет к первому и берет оттуда. Так хоть можно объяснить, почему у голого актера в инвентаре ничего нет (а не лежат не-экипированные вещи).
Ну, или пусть это будет один сундук недалеко от триггера - разницы особо нет.

Если надо именно запоминать, кто что экипирует, то в скрипте триггера можно сделать 2 таблицы, в их ячейки с одинаковыми номерами заносить актеров и экипированные ими формы. Но это реально муторно и не так просто (+ куча защит от попыток доступа к одной и той же ячейке при строго одновременном срабатывании нескольких копий OnTriggerEnter).
Запоминать можно и в скрипте, прицепленном к актеру или к алиасу, в котором находится актер (второе сложнее, зато актеры могут быть любыми, а не только предустановленные в СК). Но у тебя же для бани спец. НПС, да? Иначе пришлось бы менять им Outfit.

Можно запоминать аналогиями: создать столько же форм спец. неигровых Misc, сколько разных форм полотенцев, поместить все Misc в другой форм-лист. Когда удаляется полотенце, находящееся в форм-листе под индексом (i), актеру взамен выдается Misc под таким же индексом из второго листа. Поскольку Misc неигровой с весом 0, он вообще никак не может быть обнаружен или взят игроком из инвентаря актера (даже кнопкой Взять все). Когда актер покидает триггер, проверяется наличие в его инвентаре всех Misc (перебором 2 форм-листа). Первый найденный под индексом (i) Misc удаляется, и актеру взамен выдается / экипируется полотенце с индексом (i) из первого листа.
Впрочем, можно кодировать (i) полотенца количеством выдаваемых Misc минус 1. Тогда и форма Misc только одна потребуется.

Можно попробовать удалить или уменьшить Wait(0.15).

Можно попробовать так (не в курсе, работает ли abPreventEquip вообще):
Код
akActionRef.UnequipItem(MyForm, true)

Вот способ с аналогиями (нужен тест):
Код
MiscObject Property pxNonplayMISC Auto
    ; Спец. неигровой предмет (флаг Playable снять, вес 0, модель любая).
FormList Property aaaBathTowel Auto

Bool bL

Event OnTriggerEnter(ObjectReference akActionRef)
    Actor MyActor = akActionRef as Actor
    IF !MyActor
        RETURN
    ENDIF
    bL = true
    Form xF
    Bool bD
    Int iC = aaaBathTowel.GetSize()
    While iC && !bD
        iC -=1
        xF = aaaBathTowel.GetAt(iC)
        IF MyActor.GetItemCount(xF)
            bD = true
        ENDIF
    EndWhile
    IF bD
        MyActor.UnequipItem(xF)
        MyActor.RemoveItem(xF, 999)
        IF !MyActor.GetItemCount(pxNonplayMISC)
            MyActor.AddItem(pxNonplayMISC, iC + 1)
        ENDIF
    ENDIF
    bL = false
EndEvent

Event OnTriggerLeave(ObjectReference akActionRef)
    Actor MyActor = akActionRef as Actor
    IF MyActor
        WHILE bL
            Utility.Wait(0.01)
        ENDWHILE
        MyActor.RemoveItem(pxNonplayMISC, 999)
    ENDIF
EndEvent
Код
; На алиасы, заполняемые актерами в бане.

MiscObject Property pxNonplayMISC Auto
FormList Property aaaBathTowel Auto

Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
    IF akBaseItem == pxNonplayMISC
        akBaseItem = aaaBathTowel.GetAt(aiItemCount - 1)
        (GetReference() AS Actor).AddItem(akBaseItem)
        (GetReference() AS Actor).EquipItem(akBaseItem)
    ENDIF
EndEvent

emelya8307  Offline  Сообщение №3022 написано: 7 Февраль 2021, 00:27 | Отредактировано: emelya8307 - 7 Февраль 2021, 00:27



22
Multigone, спасибо, сейчас тупо скопировал ваши скрипты, не вникая в суть(время позднее), запустил мод. При входе в бассейн НПС раздеваются. При входе-выходе игрока из локации так и сидят в бассейне раздетыми (это хорошо). Но при выходе из бассейна один надел свою дефолтную одежду, второй просто вышел голый, а третий надел полотенце)))

Multigone  Offline  Сообщение №3023 написано: 7 Февраль 2021, 15:08



724
emelya8307, не говорю, что это самый совершенный способ, или что он вообще уместен в данном случае, но, по крайней мере, его ядро работает как полагается, в чем я почти не сомневался. Сейчас проверил это на игроке, эмулировав события триггера стартом и финишем маг. эффекта. Схема будет работать и у тебя, если:
- НПС находятся в алиасах квеста, а не абы где.
- НПС мгновенно не экипируют другой предмет после экипирования полотенца, потому что хотят.
- спец. Misc преждевременно не удаляется из инвентаря НПС к.-л. другим образом (например, скриптами RemoveAllItems() или Reset()).
- OnTriggerLeave срабатывает для объектов как полагается, если при загрузке локации они уже находились внутри пространства триггера.
- Property скриптов правильно настроены.

Вот тебе другой способ (повнимательней с комментариями внутри, нужен тест):
Код
Quest Property MyQuest Auto

Int Property piFirstNumAlias Auto
    ; номер первого алиаса, отведенного для НПС (смотреть в СК).
    ; номера должны идти строго по порядку, т.е. нельзя удалять алиасы после их создания.
Int Property piLastNumAlias Auto
    ; номер последнего алиаса, отведенного для НПС

Bool bL

Event OnTriggerEnter(ObjectReference akActionRef)
    Actor MyActor = akActionRef as Actor
    IF !MyActor || MyActor == Game.GetPlayer()
        RETURN
    ENDIF
    bL = true
    ReferenceAlias xR = GetAliasByActor(MyActor)
    IF xR
        Armor xP = (xR AS MyAliasScriptName).MyPolotentze
                        ; Вместо MyAliasScriptName указать реальное название скрипта, прицепленного к алиасам НПС.
        IF xP
            MyActor.UnequipItem(xP)
            MyActor.RemoveItem(xP, 999)
        ENDIF
    ENDIF
    bL = false
EndEvent

Event OnTriggerLeave(ObjectReference akActionRef)
    Actor MyActor = akActionRef as Actor
    IF !MyActor || MyActor == Game.GetPlayer()
        RETURN
    ENDIF
    Int iC = 50
    WHILE bL && iC
        Utility.Wait(0.01)
        iC -= 1
    ENDWHILE
    ReferenceAlias xR = GetAliasByActor(MyActor)
    IF xR
        Armor xP = (xR AS MyAliasScriptName).MyPolotentze
                        ; Вместо MyAliasScriptName указать реальное название скрипта, прицепленного к алиасам НПС.
        IF xP
            MyActor.AddItem(xP)
            MyActor.EquipItem(xP)
        ENDIF
    ENDIF
EndEvent

ReferenceAlias FUNCTION GetAliasByActor(Actor xA)
    Int iC = piFirstNumAlias
    WHILE iC <= piLastNumAlias
        ReferenceAlias xR = MyQuest.GetAlias(iC) AS ReferenceAlias
        IF xR.GetReference() AS Actor == xA
            RETURN xR
        ENDIF
        iC += 1
    ENDWHILE
ENDFUNCTION

Код
; На алиасы НПС.

FormList Property aaaBathTowel Auto
Armor Property MyPolotentze Auto Hidden

Event OnObjectEquipped(Form akBaseObject, ObjectReference akReference)
    IF aaaBathTowel.HasForm(akBaseObject)
        MyPolotentze = akBaseObject AS Armor
    ENDIF
EndEvent

emelya8307  Offline  Сообщение №3024 написано: 7 Февраль 2021, 21:37 | Отредактировано: emelya8307 - 7 Февраль 2021, 22:35



22
Multigone, А ларчик, оказывается, просто открывался! В ваших скриптах увидел условие
Код
If !MyActor
    RETURN

У меня триггер бассейна расположен внутри большого триггера, который как раз и выдает и экипирует полотенца при входе в интерьер. Когда в условии события OnTriggerEnter я прописал IF !MyActor то сразу скрипты (мои) стали работать как надо. Видимо при загрузке локации большой триггер экипировал всех НПС в полотенца. Век живи, век учись!!! Огромное спасибо за помощь!

UPD Хотя нет, щас потестил, все-таки глюки случаются. Дело не в скриптах, дело скорее всего в конфликте триггеров находящихся один в другом и претендующих на одни и те же переменные. Едрить я бестолочь

Multigone  Offline  Сообщение №3025 написано: 7 Февраль 2021, 22:44 | Отредактировано: Multigone - 11 Февраль 2021, 16:26



724
emelya8307, лол, это условие точно не может ничего починить. Оно просто пропускает события, активируемые объектами-не-актерами, например, если кинуть в триггер кружку, или сквозь него пролетит фаербол.
Код
Событие ПриПопадании(Объект Попаданец = кружка)
    Актер МойАктер = Попаданец Как Актер ; (= кружка Как Актер = пусто)
    Если (МойАктер == пусто)
        Отменить дальнейшие действия

PS: Подводя итоги - пол-страницы темы потрачено без смысла, потеряно время - все по причине, что вопрос не был расписан, как следует.

Evelyn  Offline  Сообщение №3026 написано: 4 Март 2021, 16:28



2
Здравствуйте. Помогите чайнику, пожалуйста.
Пытаюсь сделать для себя мод на летающую лошадь. А именно, скрипт, прописанный в окне Актора. (актор - призываемое существо расы "лошадь". типа Арвака, внешне видоизменённого). Скрипт инициируется по On3DLoad.
Смотрела уже три мода: летающего Пегаса, мод Real Flying с надеваемыми крыльями и Flying Mod (Летающий Довакин). Ни один не подошёл, крайние два реализованы на отключении коллизий / увеличении высоты прыжка соответственно, с помощью команд, которые, как я поняла, могут быть вызваны только применительно к ГГ (консольные читы, грубо говоря). Пегас в корне видоизменяет управление лошадью (скрипт двемерского дирижабля) и делает его, мягко говоря, неудобным.
Может быть, я не права, и есть способ вызвать консольные команды скриптом именно для коня, а не для ГГ? Например, как применить функцию SetIniBool("bDisablePlayerCollision:Havok",true) непосредственно на коня? Либо аналог Game.SetGameSettingFloat("fJumpHeightMin", <...>) именно для коня, а не для для игрока?

Dsion  Offline  Сообщение №3027 написано: 5 Март 2021, 12:57 | Отредактировано: Dsion - 5 Март 2021, 12:58



Evelyn, (абсолютно бесполезный пост, просто ради флуда) я когда-то давно тоже пробовал реализовать полёты (без skse). Первый вариант был - это тупо постоянно перемещать объект вперёд (туда, куда он смотрит). Для неживых объектов можно отключить физику и "падение" функцией SetMotionType() и работало нормально. А с живыми - уже и не помню. Падение точно мешало. Можно попробовать либо SetMotionType(), либо покопаться в nif файлах, где настраиваются коллизии.
А второй вариант был вообще полным бредом. Я сделал куб воды и постоянно перемещал его туда, где находится игрок. То есть, игрок как-бы всегда был в воде и плавал. Было весело, но куб задевал и других акторов + неживые объекты вокруг и они вели себя странно.

Myprism  Offline  Сообщение №3028 написано: 5 Март 2021, 14:27


Физик


Evelyn, существует мод "летающая метла" https://www.nexusmods.com/skyrim/mods/19069 В принципе, она делает то, что вам нужно. Метла ведёт себя как конь (даже ржёт), главный герой на ней летает.

Multigone  Offline  Сообщение №3029 написано: 5 Март 2021, 17:27



724
Цитата Myprism

главный герой на ней летает

А точнее, скачет по невидимой поверхности, подставляемой под "коня" и располагаемой под углами камеры игрока. Но в этом нет ничего плохого, я сам так делал, только не для игрока, а для гигантского паука в небе xD

Evelyn  Offline  Сообщение №3030 написано: 6 Март 2021, 08:56



2
Цитата Multigone

А точнее, скачет по невидимой поверхности, подставляемой под "коня"

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

Всем спасибо за ответы!

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





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