• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Изменение репутации для пользователя yakor77
yakor77Offline
Сообщение №3001
написано: 6 декабря 2020, 21:23
| Отредактировано: yakor77 - 6 декабря 2020, 21:29
Фродо01, идея красивая, свежая, но... опасная. Если в Скайриме начнется эпидемия, и все жители станут вампирами, будет очень плохо. Вводя яд, сразу надо готовить и противоядие. Подумайте, какой должна быть магическая вакцина, антивампирская прививка, чтобы эпидемию остановить и погасить. И соотв. квест от ярлов к Довакину. Да, и переболевшим и выздоровшим хорошо бы добавить какой-нибудь полезный вампирский перк. Остаточный и слабенький. Например, ночное зрение на 1 чвс. Повышенную сопротивляемость к ядам, болезням, холоду... ну, что-нибудь этакое.
С уважением. Маг Иридий.
Изменение репутации для пользователя CYNIC78
CYNIC78Offline
Сообщение №3002
написано: 7 декабря 2020, 15:39
| Отредактировано: CYNIC78 - 7 декабря 2020, 16:04
Здравствуйте. Вопрос к знатокам папируса и CK. У меня есть кастом раса и мне нужно сделать так чтоб на ней НЕ работали все эффекты восстановления здоровья - restore health, включая эффекты восстановления при помощи зельев. По задумке мода игрок должен восстанавливаться через команду Game.GetPlayer().ResetHealthAndLimbs(). Скрипт повешен на объекты, при активации которых происходит полное восстановления здоровья. Как блокировать восстановление здоровья ванильными способами (с помощью магии восстановления и зелий) наиболее эффективно и надежно? Самый тупой способ, до которого я пока додумался это добавить в creation kit к соответствующим магическим эффектам условие, при котором эффект не срабатывает если у персонажа есть кейворд моей кастомной расы. При наличие данного условия все работает как надо - эффекты не срабатывают на моей расе, но тут же возникает проблема - если после моего мода будет загружен любой мод, меняющий магические эффекты зелий или соответствующих заклинаний восстановления, то, естественно, у них не будет данного условия и моя фича перестанет работать. Значит, нужно найти другой способ, например добавить к моей расе абилку, которая должна проверять и блокировать все эффекты восстановления здоровья, которые применяются на игроке во время игры. Но как это сделать по проще и понадежнее? Или может есть другой способ, например, через скрипты? Заранее спасибо.
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №3003
написано: 7 декабря 2020, 16:09
| Отредактировано: Dsion - 7 декабря 2020, 16:10
CYNIC78, вроде, у перков есть entry point, позволяющая усилить или ослабить силу входящих заклинаний. Можно попробовать умножить силу заклинаний с кевордом хила на ноль. Хотя это я так - сам не проверял. Но менять эффекты - точно лажа.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №3004
написано: 7 декабря 2020, 19:10
| Отредактировано: Multigone - 7 декабря 2020, 19:30
frodo01, вроде в Better Vampires это уже реализовано (заражение).
CYNIC78, есть моды, где здоровье добавляется скриптами (SomeActor.RestoreAV("Health", 10.0)). С этим-то что будешь делать? Еще здоровье меняется, если надевается шмот с бустом максимума здоровья (в этот момент к текущему здоровью прибавляется величина, равная бусту. То же самое происходит, если менять макс. здоровья командой ModAV). И с этим? Я к тому, что, если озаботиться вопросами совместимости, то надо предусмотреть как можно больше вещей, касающихся твой идеи.
CYNIC78, вроде, у перков есть entry point, позволяющая усилить или ослабить силу входящих заклинаний. Можно попробовать умножить силу заклинаний с кевордом хила на ноль. Хотя это я так - сам не проверял.Но менять эффекты - точно лажа.
Спасибо за подсказку. Попробую сделать через перки. Если все получится, то хотя бы ванильные эффекты будут отсечены. Надеюсь получится. Обязательно отпишусь о результатах.
Еще раз спасибо. Вобщем, сделал перк, добавил Multiplier 0.00 в условиях проставил все заклинания с ключевыми словами healing и все сработало. Единственно пришлось добавить абилку на расу и в скрипте прописать добавление нужного перка, другого способа добавления перка чето не нашел.
Всегда сообщает "none"? Речь идёт об экипировке шмотки, на которой висит данный скрипт, на левельном актёре при первой встрече его в игре. Да, если важно, то актёр изначально мёртв. Шмотка экипируется, поэтому и событие срабатывает. Шмотка на актёре отображается правильно, но почему её не распознаёт скрипт?
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №3008
написано: 8 декабря 2020, 16:05
| Отредактировано: Multigone - 11 февраля 2021, 13:21
Myprism, потому что предмет, находящийся в инвентаре, но не (находящийся в алиасе / попавший в инвентарь из мира), не имеет собственного RefID? Т.к. твой Self - это ObjectReference. В таких случаях, если скрипт планируется добавлять к нескольким разным предметам (т.е. использовать как шаблон), создают несколько Property, но заполняют только какой-то один, и заполняют именно тем предметом, которому этот скрипт добавлен:
Код
Armor Property MyARMO Auto Weapon Property MyWEAP Auto MiscObject Property MyMISC Auto ...
Всех с наступившим! Нужна помощь со скриптом. Допустим, игрок подбирает Предмет. По умолчанию, этот Предмет оказывается в инвентаре игрока и исчезает из игрового мира. Как сделать так, чтобы Предмет оказался в инвентаре игрока, но не исчез из игрового мира, а отключился (Disable). А после того, как предмет удалится из инвентаря игрока, он вновь появился (Enable) там, откуда его взяли. Буду рад любой помощи.
grumpos, существует событие: предмет попал в ваш инвентарь. Ваш инвентарь, это контейнер, и для него существует такое событие. Так же такое событие (смена контейнера) существует и для предмета. Вот в эти события мы можем вставить код манипулирования объектом. Но при этом заметьте, эти события происходят только в том случае, если игрок взял этот предмет. Иначе нам некуда вставлять свой код. В случае, если игрок выбросил этот предмет, можно отдать команду выбрасывания такого же предмета в интересующую нас локацию, причём, его можно перенести именно в назначенные координаты. А можно отреспавнить всю локацию, чтобы предмет там сам восстановился.
Приоткрою завесу тайны ) Предмет - это мыло. В игре это выглядит так: мыло лежит на тумбочке (не в контейнере!), игрок берет это мыло и идет в душ. По окончании процесса (анимация запускается только при наличии у игрока мыла) оно удаляется из инвентаря игрока и вновь появляется на тумбочке. Локация всегда одна - дом игрока. Как должен выглядеть скрипт в части появления мыла? Можно как-то вместо удаления переместить его из инвентаря на прежнее место?
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №3012
написано: 3 января 2021, 08:49
| Отредактировано: Multigone - 8 февраля 2021, 20:18
Приветствую! Друзья, не могу разобраться с пакетами АИ. Почему не работает пакет в алиасе? Создал квест, алиас актера. Алиас заполняется случайным уникальным персонажем, список персонажей есть в кондишенах алиаса. В алиасе создал пакет. Актер должен при страте квеста прийти в определенную локацию и находиться там. Дело в том, что актер при старте квеста продолжают заниматься своими делами, и никуда не идёт. Алиас заполняется как надо, случайным персонажем из кондишенов. В пакете прописана локация и референс, возле которого он должен находиться и юзать маркеры. Если его принудительно фрагментом скрипта отправить в эту локацию, он там появляется и юзает маркеры, как положено. Не идет. Смотрел похожий мод, там все работает, делал точно так же. Вобщем долго рассказывать, может кто-то сталкивался с похожей проблемой?
UPD: разобрался. На двери в локацию висел скрипт. Убрал скрипт с двери - актеры стали заходить, пакет заработал.
Скажите, пожалуйста, как получить день недели? Мне нужно, чтобы событие происходило регулярно в определенный день недели. (Сандас, например). Как игра это вычисляет? Единственное, что нашел, это глобальная переменная GameDaysPassed, количество дней с начала игры. Как из нее вычислить текущий день недели? Заранее, спасибо.
Изменение репутации для пользователя yakor77
yakor77Offline
Сообщение №3016
написано: 12 января 2021, 09:53
| Отредактировано: Multigone - 12 января 2021, 16:17
количество дней с начала игры. Как из нее вычислить текущий день недели?
- арифметически. Каждый день недели закономерно повторяется через 7 дней. Значит, надо делить на 7, и смотреть остаток от деления. Математики в таких случаях говорят про "вычет по модулю 7". Погуглите, например, как строятся "вечные календари".
С уважением. Маг Иридий.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №3017
написано: 12 января 2021, 17:10
| Отредактировано: Multigone - 12 января 2021, 19:17
Доброго времени суток. Кайо полный чайник в скриптах, но честно пыталась найти, как реализовать скрипт внутри диалога, который создавал бы переменную (или свойство, как я понимаю, лучше свойство, да?), а затем в дальнейших репликах диалога изменял бы её (банально путём добавления/вычитания числа), а сравнение этой переменной с фиксированными значениями открывало бы определённые ветки диалога.
Казалось бы, это не должно быть сложно, но Кайо не нашла толковых примеров объявления и изменения новых переменных/свойств в скриптовых окошках Begin/End настройки реплики, как и того, как засунуть итоговое значение в условие. Я попробовала ввести в поле End лишь единожды активируемой реплики такую фразу с объявлением переменной: "int property BLlevel = 1 auto" (где BLlevel - название моего свойства), нажала на компиляцию и получила триаду ошибок:
"...\TIF__0903E5C3.psc(9,0): no viable alternative at input 'int' ...\TIF__0903E5C3.psc(9,0): no viable alternative at input 'int' ...\TIF__0903E5C3.psc(9,25): required (...)+ loop did not match anything at input 'auto' "
Понятия не имею, что не так, и как тогда надо. К тому же, если самый первый шаг ознаменовался таким фейлом, вангую, остальные части моего чайничевского плана заочно обречены на провал (Я планировала в остальных репликах прописывать просто BLlevel += 100 (или -=), а вот как использовать это в поле Conditions, и вовсе, по сути, пока не знаю, но подозреваю, что это можно как-то выкрутить через GetVMQuestVariable).
Объясните, пожалуйста, кто знает, как именно всё это использовать. Заочно благодарю за участие.
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 тут писалось (в той или иной форме).
Здравствуйте! Помогите горе-скриптописателю. Делаю для себя мод наподобие "Северных бань Скайрима". Чтобы НПС не расхаживали в бане нагишом, при входе им экипируется полотенце. Когда входят в бассейн - там триггер, полотенце снимается, при выходе - снова надевается. НПС у меня не специально созданные. Пустые алиасы заполняются случайными городскими персонажами, которые играют роль посетителей бани, когда игрок принимает водные процедуры. Проблема в чем - если я выйду из этой локации, а затем снова зайду - НПС сидят в бассейне в полотенцах.
Пока что на триггер бассейна прицепил скрипт:
Код
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
MultigoneOffline
Сообщение №3021
написано: 5 февраля 2021, 23:33
| Отредактировано: Multigone - 11 февраля 2021, 13:33
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
emelya8307Offline
Сообщение №3022
написано: 6 февраля 2021, 21:27
| Отредактировано: emelya8307 - 6 февраля 2021, 21:27
Multigone, спасибо, сейчас тупо скопировал ваши скрипты, не вникая в суть(время позднее), запустил мод. При входе в бассейн НПС раздеваются. При входе-выходе игрока из локации так и сидят в бассейне раздетыми (это хорошо). Но при выходе из бассейна один надел свою дефолтную одежду, второй просто вышел голый, а третий надел полотенце)))
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
emelya8307Offline
Сообщение №3024
написано: 7 февраля 2021, 18:37
| Отредактировано: emelya8307 - 7 февраля 2021, 19:35
Multigone, А ларчик, оказывается, просто открывался! В ваших скриптах увидел условие
Код
If !MyActor RETURN
У меня триггер бассейна расположен внутри большого триггера, который как раз и выдает и экипирует полотенца при входе в интерьер. Когда в условии события OnTriggerEnter я прописал IF !MyActor то сразу скрипты (мои) стали работать как надо. Видимо при загрузке локации большой триггер экипировал всех НПС в полотенца. Век живи, век учись!!! Огромное спасибо за помощь!
UPD Хотя нет, щас потестил, все-таки глюки случаются. Дело не в скриптах, дело скорее всего в конфликте триггеров находящихся один в другом и претендующих на одни и те же переменные. Едрить я бестолочь
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №3025
написано: 7 февраля 2021, 19:44
| Отредактировано: Multigone - 11 февраля 2021, 13:26
emelya8307, лол, это условие точно не может ничего починить. Оно просто пропускает события, активируемые объектами-не-актерами, например, если кинуть в триггер кружку, или сквозь него пролетит фаербол.
Код
Событие ПриПопадании(Объект Попаданец = кружка) Актер МойАктер = Попаданец Как Актер ; (= кружка Как Актер = пусто) Если (МойАктер == пусто) Отменить дальнейшие действия
PS: Подводя итоги - пол-страницы темы потрачено без смысла, потеряно время - все по причине, что вопрос не был расписан, как следует.
Здравствуйте. Помогите чайнику, пожалуйста. Пытаюсь сделать для себя мод на летающую лошадь. А именно, скрипт, прописанный в окне Актора. (актор - призываемое существо расы "лошадь". типа Арвака, внешне видоизменённого). Скрипт инициируется по On3DLoad. Смотрела уже три мода: летающего Пегаса, мод Real Flying с надеваемыми крыльями и Flying Mod (Летающий Довакин). Ни один не подошёл, крайние два реализованы на отключении коллизий / увеличении высоты прыжка соответственно, с помощью команд, которые, как я поняла, могут быть вызваны только применительно к ГГ (консольные читы, грубо говоря). Пегас в корне видоизменяет управление лошадью (скрипт двемерского дирижабля) и делает его, мягко говоря, неудобным. Может быть, я не права, и есть способ вызвать консольные команды скриптом именно для коня, а не для ГГ? Например, как применить функцию SetIniBool("bDisablePlayerCollision:Havok",true) непосредственно на коня? Либо аналог Game.SetGameSettingFloat("fJumpHeightMin", <...>) именно для коня, а не для для игрока?
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №3027
написано: 5 марта 2021, 09:57
| Отредактировано: Dsion - 5 марта 2021, 09:58
Evelyn, (абсолютно бесполезный пост, просто ради флуда) я когда-то давно тоже пробовал реализовать полёты (без skse). Первый вариант был - это тупо постоянно перемещать объект вперёд (туда, куда он смотрит). Для неживых объектов можно отключить физику и "падение" функцией SetMotionType() и работало нормально. А с живыми - уже и не помню. Падение точно мешало. Можно попробовать либо SetMotionType(), либо покопаться в nif файлах, где настраиваются коллизии. А второй вариант был вообще полным бредом. Я сделал куб воды и постоянно перемещал его туда, где находится игрок. То есть, игрок как-бы всегда был в воде и плавал. Было весело, но куб задевал и других акторов + неживые объекты вокруг и они вели себя странно.
Evelyn, существует мод "летающая метла" https://www.nexusmods.com/skyrim/mods/19069 В принципе, она делает то, что вам нужно. Метла ведёт себя как конь (даже ржёт), главный герой на ней летает.
А точнее, скачет по невидимой поверхности, подставляемой под "коня" и располагаемой под углами камеры игрока. Но в этом нет ничего плохого, я сам так делал, только не для игрока, а для гигантского паука в небе xD
А точнее, скачет по невидимой поверхности, подставляемой под "коня"
Кстати, у меня была когда-то такая мысль... Но она мне показалась слишком сложно реализуемой. Хотелось чего-то попроще, чем через задний вход, но, похоже, нет иных путей. Либо попробовать отключить гравитацию в ини-переменной, но пока руки не дошли, так что не знаю, что из этого может получиться. А вот с поверхностью... по идее, можно попробовать.
Всем спасибо за ответы!
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)