TwilightShadow, дружественные ловушки отмечены зеленым и по ним можно ходить. Но, если напарники пробежали вперед, их придется возвращать обратно, что чревато свободными атаками от врагов.
Вообще, управлять напарниками в бою - как собирать разбегающихся в разные стороны муравьев в кучку.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №992
| Тема: Что слушаем? Продолжение
написано: 12 апреля 2022, 13:56
| Отредактировано: Multigone - 12 апреля 2022, 13:56
Lexo, а, эт я не знаю, не пользовался. Насколько я понял из описания, GetKeywordData() и SetKeywordData() позволяют получить и установить значение некой float-переменной, соотнесенной с кейвордом, имеющимся у этой локации (зачем? почему? непонятно). При этом, добавлять новые кейворды к формам, насколько я знаю, в процессе игры нельзя.
Действительно, можно запоминать какую-либо информацию об этой локации, шифруя ее значением float-переменной кейворда, при условиях:
1) У каждой локации, данные которой требуется запомнить, есть один или несколько известных кейвордов (предустановленных в СК), и
2) Дефолтное значение переменной кейворда (если его можно устанавливать из СК) не совпадает с числами, которыми предполагается шифровать информацию, и
3) Другие моды не управляют значениями этих переменных.
nepewka, не знаю, что там в F4, в Скайриме это делается так (пример для Ability):
1) Создается заклинание с FF / Self / Area, на что-либо вешается скрипт с апдейтом Х сек., кастующим это заклинание игроком. На заклинании скрипт, добавляющий попавшим в зону действия целям это Ability.
2) Либо (требуется SKSE) берется локация, в которой находится игрок в текущий момент, перебираются все подряд референсы этой локации (не уверен, что временные референсы тоже учитываются, хотя, скорее всего, да). Тем из них, что являются актерами, добавляется Ability.
Ability, добавленное скриптом, имеет баг - когда актер выгружается из мира, а потом снова загружается, Ability формально остается, но актер теряет его Effects. Хотя это можно обойти.
Особенности работы скриптов в F4 можно обсудить в этой теме.
nepewka, чтобы это работало, нужно взаимодействие между скриптом и заклинанием. Каковы особенности редактора в F4, не в курсе. Поэтому, если нужно, могу расписать версию для СК Скайрима.
Lexo, плащ очень часто обновляется (период явно меньше 1 с). Это сделано для того, чтобы актер, попавший в радиус действия (который обычно оч. небольшой), сразу же почувствовал на себе его эффекты. Большой радиус плаща вызовет (значительное?) повышение нагрузки на игру из-за частых проверок множества актеров. Впрочем, это только мое мнение.
emelya8307, хороший способ, я даже никогда и не пользовался статистикой. В зависимости от того, что задумывалось делать при открытии новой локации, и что считается новой локацией, может как подходить только для новой игры, так и для установки мода при любом прогрессе игры.
nepewka, там же написано, что следует избегать Perk Fragments, если можно это сделать другим путем. Потому, что 1) Perk Fragments работают не для всех Entries, 2) Для Entries, не являющихся Activate, Perk Fragments будут срабатывать постоянно / непрерывно, чрезмерно загружая систему скриптов, 3) Желательно использовать Perk Fragments только для Entries - Activate, потому что код будет выполняться один раз при активации чего-либо, как в Скайриме.
1) Вон же написано - тип переменной "текстовая" не соответствует ожидаемому "ActorValue". Все функции в F4, использующие Actor Values, имеют в качестве аргумента переменные с типом ActorValue. В отличие от Скайрима.
2) Думаю, нужно сперва написать ";" в тексте, затем скомпилировать, закрыть и заново открыть окно перка, в окне редактирования свойств скрипта добавить новую ActorValue Property Health, и только потом писать akActor.ModValue(Health, 10.0). Впрочем, я не знаю, не разбираюсь, не могу проверить.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №1001
| Тема: Вопросы по скриптам Papyrus
написано: 27 апреля 2022, 18:58
| Отредактировано: Multigone - 27 апреля 2022, 19:24
nepewka, связать актера со скриптом, в котором (периодически?) будут проверяться блоки условий, соответствующих условиям всех требуемых Perk Entry, имеющихся у этого актера. В Скайриме, например, не все условия, что есть в СК Conditions, имеют аналоги в Papyrus.
V. 2: для каждого Perk Entry каждого перка создать копию, которая будет только Add Value твоего счетчика. Для этого надо найти такой тип Entry Point, который меняет какое-то неиспользуемое Actor Value, оставшееся от Скайрима (напр., Mod Armor Rating?), и значение которого можно узнать (GetAV). Нагрузка на проверку условий удваивается. Опять-таки, многие Entry Point имеют доп. вкладки с условиями, которых не будет у Mod Armor Rating. И все это в случае, если старые Entry еще работают.
nepewka, а как работают фрагменты стадий? Не выполняют ли они свой код только при переходе квеста на эти стадии? А если у тебя такой перк, который, к примеру, увеличивает урон только в случае, когда у актера уровень здоровья ниже 50%? Здоровье - переменная, меняющая свое значение, следовательно, перк может как добавлять урон, так и нет. Тебе нужно будет отследить бонус или его отсутствие через стадию квеста.
nepewka, оптимальный способ, как я и говорил - когда необходимо узнать множители урона / прочего у актера, скриптом проверяются условия, соответствующие условиям требуемых Perk Entry. На основании проверок делаются выводы, какие Perk Entry в данный момент активны, и высчитывается множитель (по такой же формуле, что указана в Entry Point). Проблема, что не все условия СК можно проверить в папирусе. Проблема 2 в том, что бонус урона может предоставляться против опред. целей (вкладка условий Target), значит, чтобы узнать, применяется ли этот бонус, нужно еще и знать, какую цель атакует этот актер.
nepewka, посмотри OnTimer() и OnTimerGameTime(), похоже, это аналоги OnUpdate() и OnUpdateGameTime(), только лучше, потому что в одном скрипте можно использовать сразу несколько таймеров. Впрочем, не уверен.
всё равно не понимаю, чем ты считаешь это лучше апдейта. а если у них разные таймеры, как они будут работать ?
Может, и ничем не лучше, кроме того факта, что в одном скрипте могут выполняться несколько параллельных / независимых таймеров вместо одного. Работать они должны так, как показано выше.
Цитата nepewka
тогда как старый добрый апдейт насколько я помню код выполнял до конца несмотря на слетевший эффект
И OnUpdate() и OnUpdateGameTime() точно так же кончались, когда прекращал действовать маг. эффект. Только цикл WHILE c Wait() продолжает работать, пока условия выполняются, с сохранением всех переменных скрипта.
nepewka, не возражаю, доделывай. Вкратце, алгоритм: в алиас квеста для игрока добавляется абилити с эффектом констант-селф-плащ. Квест запускается стандартным скриптом (флаги runOnce, startGameEnabled, может что еще)...
EVENT OnInit() IF !IsCompleted() Start() ENDIF ENDEVENT
Как выглядит и работает плащ, ты знаешь, а если нет, посмотри ваниль. На конечном эффекте плаща указываешь заметный шейдер (контроль работы) и скрипт "при старте этого эффекта дать перк". В условиях эффекта указать "если субъект не имеет этого перка". Подавляющее большинство вопросов по функционалу скриптов можно изучить в СК-вики.
Это все для Скайрима, исключая выдачу перка, что там для F4 - не в курсе.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №1011
| Тема: Вопросы по скриптам Papyrus
написано: 30 апреля 2022, 21:58
| Отредактировано: Multigone - 30 апреля 2022, 22:05
в алиас квеста для игрока добавляется абилити с эффектом констант-селф-плащ. Квест запускается стандартным скриптом
В референс алиас квеста, изначально заполненный игроком. Абилити можно добавить только в окно Spells алиаса. Скрипт со Start() вешается во вкладку Scripts квеста. Это ж все базовые вещи.
Mgichko, попробуй следующее (не уверен, что подойдет для SE): в Data/Scripts/Source создай текстовый файл с указанным содержанием, затем переименуй его в TESV_Papyrus_Flags.flg
Flag Hidden 0 { Script Property } Flag Conditional 1 { Script Variable }
valambar, общее правило для пустого окна скрипт-фрагментов диалогов: в одном из окон написать ";", скомпилировать, сохранить (закрыть) окно диалога, открыть его, добавить нужное Property (кнопка сбоку), стереть ";", написать желаемый код, в котором выполняются операции с этим Property. Скомпилировать.
Событий там нет, код выполняется в момент начала или конца диалога (это и есть события скрипт-фрагментов диалогов). Сам код будет выглядеть так:
6aJI_aMyT, и Skyrim LE, и Skyrim SE имеют возможность установки модификаций, но не одних и тех же, а заточенных под соотв. версию. Здесь рассуждения об их различии. Большинство популярных модов портировано на SE. Обычно в их описаниях указано, для каких версий подходит мод.