Вверх Вниз


Модератор форума: Kris†a™, Multigone  
Форум » 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? Пиши не в ЛС, а в эту тему.
xCYNICx  Offline Сообщение №2911 написано: 31 Мая 2020 в 21:06 | Отредактировано: Multigone - Вторник, 02 Июня 2020, 21:14


Странник


6
Цитата Dsion ()
xCYNICx, посмотри функцию GetHeadingAngle(). Скорее всего, это то, что нужно.

Спасибо большое. Это, действительно то что нужно. Работает замечательно. Единственное чего я не пойму, если я напрямую вставляю функцию akTarget.GetHeadingAngle(akCaster) в условие, тогда компиляция проходит успешно, но когда пытаюсь присвоить переменную - скрипт не хочет компилироваться - блокнот вылетает:

Код
Event OnEffectStart(Actor akTarget, Actor akCaster)

    direction = akTarget.GetHeadingAngle(akCaster) ; пытаюсь присвоить переменную - вылет

    if direction > 90 && direction < 180
        akCaster.PlayIdleWithTarget(pa_01, akTarget)
        Debug.MessageBox("Back")
    Else
        akCaster.PlayIdleWithTarget(pa_02, akTarget)
        Debug.MessageBox("Front")
    endif
Endevent

Вообще, спасибо, ребята, я сегодня на вашем форуме узнал и освоил намного больше полезной инфы, чем за две недели копания в гугле на тему папируса.

Dsion  Offline Сообщение №2912 написано: 31 Мая 2020 в 22:39



1285
xCYNICx, я уже года 2-3 не писал на папирусе, но, вроде, это же язык со строгой типизацией. То есть, надо объявлять тип переменной:
float direction = ...

Myprism  Offline Сообщение №2913 написано: 02 Июня 2020 в 12:51


Физик


1615
Смущают меня задержки установленные в чужом коде. Прежде всего тем, что я не всегда могу понять назначения некоторых из них и поэтому не могу их разумно расставлять. Вот пример самого конца одной функции:
Код
update = true
Utility.wait( 0.15 )
RegisterForSingleUpdate( 0.6 )

Дальше в функции ничего нет. Я бы ещё понял эту задержку, если бы её значение превышало 0.6 секунд задержки обновления, но зачем нужна задержка 0.15 секунд, если потом всё равно надо ждать 0.6?

Multigone  Offline Сообщение №2914 написано: 02 Июня 2020 в 15:00 | Отредактировано: Multigone - Вторник, 02 Июня 2020, 15:03



647
Myprism, Wait() может использоваться для ожидания закрытия игроком любых меню - например, событие возникает в момент ковыряния игроком шмоток в инвентаре - часть кода события, нижеследующая за ожиданием, выполнится только после того, как игрок выйдет оттуда.

Конкретно в случае комбо (Ожидание + Регистрация), если оно находится в потенциально часто повторяющемся событии (например, OnHit()), это уменьшает минимальное время между повторными апдейтами.
Как мы знаем, повторная регистрация апдейта, если была вызвана до того, как событие апдейта произошло, заменяет собой предыдущую. А вовсе не генерирует второе событие апдейта, независимое от первого. Поэтому, минимальный интервал времени между повторными апдейтами, вызываемыми из одного и того же события, равен времени в регистрации:

Код
EVENT OnHit()
    RegisterForSingleUpdate(1.0)
ENDEVENT

EVENT OnUpdate()
    ; независимо от того, с какой частотой будет срабатывать OnHit, OnUpdate будет срабатывать не чаще, чем один раз в 1с.
ENDEVENT

Этот период можно уменьшить, используя комбо (при этом факт. задержка времени от момента регистрации до апдейта по прежнему будет равна 1с):

Код
EVENT OnHit()
    Utility.wait(0.4)
    RegisterForSingleUpdate(0.6)
ENDEVENT

EVENT OnUpdate()
    ; OnUpdate будет срабатывать с макс. частотой = один раз в 0.6с.
ENDEVENT

Я точно помню, что сам пользовался такой конструкцией. Но это может понадобиться только в очень специфических случаях.
Вот тут наглядно (плиз, только не говори, что ничего не понял xD).

風たちぬ今和歌春神髪
Myprism  Offline Сообщение №2915 написано: 03 Июня 2020 в 10:07


Физик


1615
Multigone, спасибо. С картинкой всё очень наглядно и понятно. Я вообще графическую информацию воспринимаю намного легче, чем вербальную. Получается так: Комбинация задержки Utility.wait() и RegisterForSingleUpdate() нужна в том случае, если нужно получить заметную общую задержку при максимальной скорости реакции на событие (малая величина RegisterForSingleUpdate())

А вот с первой частью
Цитата Myprism ()
Wait() может использоваться для ожидания закрытия игроком любых меню - например, событие возникает в момент ковыряния игроком шмоток в инвентаре - часть кода события, нижеследующая за ожиданием, выполнится только после того, как игрок выйдет оттуда.
понятно не до конца. И, возможно, это как раз то, что мне нужно. У меня сейчас персонажи переодеваются при смене типа локаций или изменения статуса - бой, плавание. Так вот, если переодевание происходит через меню, то оно происходит безукоризненно, а вот если через OnUpdate(), то иногда - через пень-колоду.
Поэтому у меня остались вопросы. Вот конкретный код:
Код
npc.OpenInventory( true ) ; npc - персонаж
Utility.wait(0.1)
FixGear() ; процедура смены одежды

срабатывает безукоризненно. Как я понимаю, в этом случае, открывается инвентарь, игрок оперирует с ним, потом закрывает инвентарь и только после этого включается задержка? В обработчиках событий манипуляций со снаряжением (ведь только они срабатывают при открытом меню) задержек нет. Непосредственно после закрытия меню обычно никаких событий не происходит, так как меню открывают в спокойной обстановке.
Во втором случае процедура
Код
FixGear()

Включается непосредственно в событии OnUpdate(). И вот тут у меня возможны глюки - иногда меняются не все шмотки. И это событие может вызываться многократно и в разных обстоятельствах, например по упомянутому тобой OnHit(). Наверное, надо поставить задержку после FixGear()? Или до?

Multigone  Offline Сообщение №2916 написано: 03 Июня 2020 в 14:41 | Отредактировано: Multigone - Среда, 03 Июня 2020, 15:07



647
Myprism, проще говоря, счетчики Wait() и RegisterForUpdate() останавливаются, пока игра находится на паузе. Например, если играть с модом, убирающим паузу, то и Wait() будет истекать, несмотря на открытые меню (уверен на 99%).

Как я понял, у тебя такая схема:

Код
EVENT Event1() или Event2() или Event3()
    RegisterForSingleUpdate(0.5)
ENDEVENT

EVENT OnUpdate()
    FixGear()
ENDEVENT
Тут нет ничего криминального, и гарантированно не будет одновременных срабатываний OnUpdate(). Может, дело в FixGear(). Сходу сложно сказать.

Хотя... Если, к примеру, задержку поставить очень маленькую (0.05), а код внутри FixGear() требует для своего полного выполнения время > 0.05с (в силу объемности или чего-то еще, например, тех же внутренних задержек Wait()), то, когда следующее OnUpdate() стартует раньше, чем завершится предыдущее, возможно пересечение строк, приводящее к (не)предсказуемым результатам. Чтобы избежать такого, нужно делать защиту (Bool-замок или перевод скрипта в другое State). На самом деле, это очень частое явление, и его всегда надо держать на прицеле.

風たちぬ今和歌春神髪
xCYNICx  Offline Сообщение №2917 написано: 12 Июня 2020 в 17:37 | Отредактировано: Multigone - Пятница, 12 Июня 2020, 23:24


Странник


6
Всем привет. У меня снова возник вопрос. Я тут написал скрипт, который показывает меню messagebox с несколькими опциями, каждая из котороых запускает ту или иную анимацию. Все работает хорошо, но вот я хотел бы немного расширить эту функцию, мне нужно что бы после проигрывания выбранной анимации, всплывал еще один messagebox с другими опциями и возможностью отменить все, вернувшись в игру. Вот мой код:

Код
Idle Property pa_05 Auto
Idle Property pa_06 Auto
Idle Property pa_07 Auto
Idle Property pa_08 Auto
Message Property MsgNPC_01 Auto

Event OnEffectStart(Actor akTarget, Actor akCaster)
    Int iButton = MsgNPC_01.Show()
    If (iButton != -1)
        If (iButton == 0)
            Debug.Notification("pa_05")
            akCaster.PlayIdleWithTarget(pa_05, akTarget)
        ElseIf (iButton == 1)
            Debug.Notification("pa_06")
            akCaster.PlayIdleWithTarget(pa_06, akTarget)
        EndIf
    EndIf
Endevent
Заранее спасибо

Dsion  Offline Сообщение №2918 написано: 12 Июня 2020 в 21:24 | Отредактировано: Dsion - Пятница, 12 Июня 2020, 21:31



1285
xCYNICx,
Если длительность анимаций известна, то без проблем... Добавляешь в конце каждого блока RegisterForSingleUpdate(время), а в OnUpdate() - продолжение.
А если длительность не известна, то фигово. Ждать наступления какого-то события - рискованно. Мало ли, что произойдет. Ждать по времени - надежнее.

Добавлено (12 Июня 2020, 21:29)
---------------------------------------------
Можно еще рассмотреть вариант с заменой pa_0Х пропертей на один массив.
Чтоб было что-то типа

Код
Idle[] Property pa Auto;
Float[] Property pa_time Auto;

Event ...
    Int button = ...;
    If (button != -1)
        akCaster.PlayIdleWithTarget(pa[button], akTarget);
        RegisterForSingleUpdate(pa_time[button]);
    EndIf
EndEvent

Event OnUpdate()
    ...
EndEvent

Multigone  Offline Сообщение №2919 написано: 12 Июня 2020 в 22:10



647
А зачем вы проверяете на -1? Окно возвращает от 0 и выше.

風たちぬ今和歌春神髪
xCYNICx  Offline Сообщение №2920 написано: 12 Июня 2020 в 22:16 | Отредактировано: Multigone - Пятница, 12 Июня 2020, 23:23


Странник


6
Цитата Dsion ()
xCYNICx,
Если длительность анимаций известна, то без проблем... Добавляешь в конце каждого блока RegisterForSingleUpdate(время), а в OnUpdate() - продолжение.
А если длительность не известна, то фигово. Ждать наступления какого-то события - рискованно. Мало ли, что произойдет. Ждать по времени - надежнее.

Можно еще рассмотреть вариант с заменой pa_0Х пропертей на один массив.
Чтоб было что-то типа
Спасибо большое. Длительность всех анимаций у меня одинаковая и известна. RegsterOnSingleUpdate сработал идеально. При активации эффекта, появляется мессэджбокс, нажатие кнопок активирует ту или иную анимацию, после проигрывания которой, всплывает новый мессэджбокс, и при нажатии кнопки, проигрывается соответствующая анимация. То что я и хотел.

Добавлено (12 Июня 2020, 22:22)
---------------------------------------------
Цитата Multigone ()
А зачем вы проверяете на -1? Окно возвращает от 0 и выше.
Если честно я и сам толком не знаю, подсмотрел кусок кода у кого-то. Но, сейчас главное для меня, что скрипт работает как я задумывал. А, вообще, я новичок в скриптинге, только недели три как начал разбираться с папирусом. Пока для меня тут много непонятного. Сейчас попробую скрипт без этого условия ( ibutton != -1).

yakor77  Offline Сообщение №2921 написано: 15 Июня 2020 в 05:30 | Отредактировано: yakor77 - Понедельник, 15 Июня 2020, 05:36


Странник


26
Приветствия коллегам! Есть проблема, хотелось бы концептуально обсудить и посоветоваться. Проблема связана со входом в дверь трех самостоятельно возводимых поместий - "Озерное", и др. С другими дверями, при тех же условиях, вылетов не происходит. Я внимательно изучил большинство доступных в Сети материалов по теме, проблема известная. Решают её по-разному, греша кто на перегрузку памяти, кто на манекены, кто на персонажи внутри здания, и пр. Я поэкспериментировал на собственной сборке, выстроив самый примитивный малый дом, и последовательно исключая всевозможные факторы (вплоть до полной переинсталляции ванильного ядра, и уменьшения дополнительных модов в сборке, тоже до ванильного ядра). Предполагаю, что там сидит какой-то баг, причем сидит он в движке, и который так и не пропатчен. Видимо, всякая перегруженная модами сборка, становится крайне чувствительной и нестабильной, к скачку напряжения, то есть, к загрузке-выгрузке. А двери в этих поместьях, в силу неизвестного мне бага, просто слабое звено, где тонко - там и рвётся. Я вынес эту дверь, прямо в игре (дисэйбл), и поставил вместо неё другую, из стороннего мода-конструктора "Построй свой дом". Пришлось залезть и в код, через криэйшн кит, и тес5эдит. Убрать родной для конструктора скриптик, навесить свой. Всё заработало. Но это сложное решение, оно не для всех. Есть предложение обдумать и обсудить концепт мягкого решения, реализованного в известном моде "Открытые города Скайрима". Там двери в город открываются, и можно провести свободный проход, без скачка загрузки-выгрузки, как под обычной аркой. Вопрос: можно ли написать аналогичный скрипт, и навесить его на эти три проклятые двери в поместьях, через магию, не прибегая к примененной мною хирургической операции? Заранее спасибо за доброжелательный ответ. (Свой код не приведу, не просите - вопрос принципа, для чистоты данного эксперимента).

С уважением.
Маг Иридий.
Myprism  Offline Сообщение №2922 написано: 15 Июня 2020 в 06:57


Физик


1615
yakor77, в Открытых Городах не скрипт. В игре города являются отдельными локациями (мирами), которые находятся не в Тамриэле. Точнее так: в Тамриэле находится очень упрощённо устроенные города, куда пользователь никогда попасть не сможет, а нужны они только для того, чтобы видеть их снаружи через городскую стену. В мирах городов, наоборот, нет Тамриэля, а есть только его ЛОДы, который игрок видит из города. В тот Тамриэль игрок тоже никак попасть не может. Настоящий город соединён с настоящим Тамриэлем порталом. В Открытых Городах фальшивый город находящийся в Тамриэле заменён на его копию из мира этого города. Мир ванильного города больше недоступен. Соединяющие эти миры порталы удалены. Таким образом, разница в том, что в ванильной игре для прохода стоят порталы, а в Открытых Городах там свободный проход и для этого используется ЕДИНАЯ навигационная сетка. Вот в этом всё дело. Не многие мододелы знают досконально, как она работает. А она ещё работает по-разному в разных версиях Скайрима. И вот как раз ошибки там и приводят к вылетам из игры. Моды могут затрагивать навигационные сетки в домах и финализировать их под Хертвай или без него. Соответственно, работать будет только с Хертфаем или без него. Если модов много, то одни их требуют установки Хертфая, другие - нет и вот тут начинается вся эта фигня.
Ну и насчёт установки большого числа модов. Они невероятно редко написаны так, чтобы специально не конфликтовать с другими модами. Обычно их авторов этот вопрос не беспокоит совершенно, а беспокоит только, как больше изменить Скайрим и убедить других, что только это и есть хорошо. Когда мне кто-то сообщает, что он поставил 200 модов, то я про себя только думаю: ты просто ещё многого не заметил :)

Иsкатель  Offline Сообщение №2923 написано: 15 Июня 2020 в 10:47


Начинающий


71
Как правильно запускать квест в дургом квесте? Пробовал в стадии квеста, в стадию квеста вставлял код
Quest2.Start() 
Quest2.SetStage(10)
не сработало, потом вставил этот же код в диалоге, тобишь в конце диалога должен был закончиться старый квест и начаться новый, но так же не сработало. В чем проблема?

Multigone  Offline Сообщение №2924 написано: 15 Июня 2020 в 17:14



647
Иsкатель, сперва попробуй запустить Quest2 консолью с помощью StartQuest. Если не запускается, проверь, что все пустые алиасы имеют флаг "Optional". Если запускается, проверь, чем заполнено Property Quest2 (должно быть твоим квестом).
В целом, неважно, откуда исходит команда на запуск - из скрипта другого квеста, маг. эффекта, актера и т.д. Если квест может запуститься, он сделает это.

風たちぬ今和歌春神髪
Иsкатель  Offline Сообщение №2925 написано: 15 Июня 2020 в 23:12


Начинающий


71
Цитата Multigone ()
Иsкатель, сперва попробуй запустить Quest2 консолью с помощью StartQuest. Если не запускается, проверь, что все пустые алиасы имеют флаг "Optional". Если запускается, проверь, чем заполнено Property Quest2 (должно быть твоим квестом).В целом, неважно, откуда исходит команда на запуск - из скрипта другого квеста, маг. эффекта, актера и т.д. Если квест может запуститься, он сделает это.
Попробовал через StartQuest я так понял если ошибок про использовании команды не было значит он запустился? У меня всего один алиас на нпс и там выбран нпс. Quest2 заполнен моим квестом(в первую очередь проверил). Сам квест, может это быть из-за выкл флажка start game enable?

yakor77  Offline Сообщение №2926 написано: 16 Июня 2020 в 04:22


Странник


26
Здравствуйте, Майпризм! Спасибо за развернутую, обстоятельную консультацию. Про конфликт с навигационной сеткой я как-то не задумывался, это интересный аспект проблемы, обдумаю. Я понял, из Вашей консультации, что решение Открытых городов мне в данном случае никак не поможет, это совсем другая тема и другой способ.
Я понимаю, что весь Скайрим лучше писать самому и системно, чем сшивать лоскутное одеяло из чужих кусков-модов, и лепить заплатку на заплатку. Но это требует очень большой мощности, действие = время*деньги, чего у меня, естественно, нет. Так что, приходится исходить из того, что есть, к сожалению.

С уважением.
Маг Иридий.
Multigone  Offline Сообщение №2927 написано: 16 Июня 2020 в 10:27



647
Иsкатель, так вроде Start Game Enabled автоматически запускает квест в момент начала новой игры. Может, он запускается, но не отображается в журнале? Проверить это можно скриптом:
Код
IF Quest2.IsRunning()
    Debug.MessageBox("Запущен")
ELSEIF Quest2.IsCompleted()
    Debug.MessageBox("Завершен")
ELSE
    Debug.MessageBox("Не запущен")
ENDIF

風たちぬ今和歌春神髪
Иsкатель  Offline Сообщение №2928 написано: 16 Июня 2020 в 10:37


Начинающий


71
Цитата Multigone ()
Иsкатель, так вроде Start Game Enabled автоматически запускает квест в момент начала новой игры. Может, он запускается, но не отображается в журнале? Проверить это можно скриптом:Код
IF Quest2.IsRunning()
    Debug.MessageBox("Запущен")
ELSEIF Quest2.IsCompleted()
    Debug.MessageBox("Завершен")
ELSE
    Debug.MessageBox("Не запущен")
ENDIF
Все нашел проблему и была она в алиасе сменив актера с ярла Балгруфа на созданного мной все заработало. Но почему так? Нельзя использовать нпс из Скайрима? Мне в квесте нужно чтоб гг поговорил с ярлом вайтрана.

Добавлено (16 Июня 2020, 13:04)
---------------------------------------------
Разобрался. Достаточно было в моем алиасе включить чек-бокс Allow reserved.


yakor77  Offline Сообщение №2929 написано: 29 Июня 2020 в 12:08 | Отредактировано: yakor77 - Понедельник, 29 Июня 2020, 12:16


Странник


26
Здравствуйте, Майпризм!
Есть вопрос к Вам, ответа на который в Сети я так и не нашел. Он касается распределения "очков навыков", между магией, здоровьем и запасом сил.
Бывает, что в игре случайно нажменшь не ту клавишу, и попадаешь в режим "на севере компаса по Таб", то есть, в режим "распределения "очков навыков". И тут ты попал! Если набежало очень много этих очков - пока их всех не прощёлкаешь, мышкой и энтером, интерефейс тебя не отпустит. А прощелкивать их, когда их многие тысячи - крайне лениво, да и клаву с мышкой разбивать тыканьем жалко. Набегают эти тысячи, например, при зачаровании. И гонят они уровень к тысяче и выше, потом приходится всё сбрасывать в реальные значения.
Однако, консоль при этом режиме - открывается. И это лазейка, можно запустить батничек.
Обычные сетевые советы, типа "сменить расу", "воспользоваться Чёрной книгой Сон наяву", или "сбросить уровень консольными командами" - здесь не помогают. Существуют и разные экзотические моды,типа "калькуляторов перков" или даже "зелий обнуления" и "обмена на души драконов". Всё это работает только в стационарном режиме, когда очки - уже распределены. Многие говорят в Сетях, что этот режим - жёсткий, избавиться от него - невозможно.
У меня тогда вопрос: можно ли написать такой скрипт, который быстро распределит эти "очки навыков" в автоматическом режиме, без нажатий игроком на кнопки и клавиши? Его можно написать в виндовых макросах, но это грубое решение. Интересует именно скайримовский скрипт. Тут должен быть цикл "пока" (пока все очки не распределены), и обращение к прерываниям, чтобы за игрока "нажимать клавиши".
Заранее благодарен за доброжелательный и концептуальный ответ.
(Меня, как всегда, интересует идея, а не код, логика построения программы.)

С уважением.
Маг Иридий.
Myprism  Offline Сообщение №2930 написано: 30 Июня 2020 в 06:56


Физик


1615
yakor77, совершенно не представляю, о чём идёт речь! При переходе на новый уровень всегда предлагается выбрать, что повышать - магию, здоровье или запас сил. Я всегда выбираю запас сил. Всё распределено. Не было у меня никогда никаких левых экранов. Скорее всего, его даёт какой то мод.

Multigone  Offline Сообщение №2931 написано: 30 Июня 2020 в 11:23



647
yakor77, если хочешь сделать это, найди переменную Settings или GlobalVariable, отвечающую либо за фактический уровень игрока (пока игрок не повысит уровень через меню, он считается такого, какой был зафиксирован после последнего повышения); либо за накопленный не распределенный бонус уровней.
В первом случае эта переменная всегда будет равна текущему уровню игрока, пока ему нечего повышать, или большей величины, если есть что.
Во втором случае эта переменная всегда будет равна 0, пока ему нечего повышать, или >0, если есть что.
Дерзай!

PS: Settings "iCalcLevelAdjustUp" и "iCalcLevelAdjustDown" не подходят, проверено.
PPS: В Actor Value подходящей переменной не найдено.
PPPS: Это может быть также, к примеру, счетчик нераспределенного опыта. Или оба сразу.
PPPPS: Пойду задам вопрос на СК.сом.

風たちぬ今和歌春神髪
yakor77  Offline Сообщение №2932 написано: 30 Июня 2020 в 13:16


Странник


26
Цитата Multigone ()
либо за накопленный не распределенный бонус уровней.
- да-да, вот именно эта переменная меня и интересует, тогда всё можно было бы сделать гораздо проще - обнулить её нафиг, до распределения очков навыков, и не заморачиваться! Но, увы, я её не нашёл. Возможно, она генерится динамически, то есть, не сохранена в сэйве, а активируется в ОЗУ, по коду движка, после нажатия соотв. клавиш. Интерфейс у меня - продвинутый, СкайЮАй. Но, и в ванильном интерфейсе, - всё то же самое, значит, дело не в нём. Если бы значение было записано в сэйве, я бы вообще с вопросом не обращался. Это была бы элементарная задача на стандартные консольные команды. Но, увы... Короче, вопрос: как выловить в оперативной памяти глобальную переменную, с неизвестным именем, по её действию, то есть, по регулярному к ней обращению, перехватить прерывания, и либо ускорить процесс автоматически, либо обнулить эту переменную?

С уважением.
Маг Иридий.
Multigone  Offline Сообщение №2933 написано: 30 Июня 2020 в 14:46



647
yakor77, в сохранении есть несколько переменных с именем Level, возможно, хранящих значения текущего и фактического уровней (например, CurrentLevel_var, LastLevel_var). Сам алгоритм повышения уровня, скорее всего, находится в недрах Skyrim.exe. Т.е., каких-то посредников в Settings / GlobalVariable, похоже, нет. Значит, узнавать и устанавливать значения этих переменных мы не можем - предотвратить появление меню повышения атрибутов тоже.
Копание в levelupmenu.swf тоже, скорее всего, ничего не даст, поскольку алгоритм ждет ответа от окна повышения атрибутов. Проверь, если знаешь как.
Управление кнопками вместо игрока, чтобы быстро прощелкивать меню, тоже не получится, т.к. выбор и активацию кнопок MessageBox'а нельзя производить клавиатурой, только мышью.

風たちぬ今和歌春神髪
yakor77  Offline Сообщение №2934 написано: 30 Июня 2020 в 19:36 | Отредактировано: Multigone - Четверг, 02 Июля 2020, 16:30


Странник


26
Цитата Multigone ()
в сохранении есть несколько переменных с именем Leve
- не, это совсем не то. Я ранее именно к такому выводу и пришёл, что это всё движком генерится. Управление "Ок" возможно с клавиатуры, а вот три кнопки - магия, здоровье и запас сил - только мышью. Всё, спасибо за консультацию, я понял, что пришёл к верным выводам, Вы мне время на самостоятельное изучение сэкономили. Буду делать виндовый макрос, я это делать умею. Он за меня, в цикле, будет распределение очков прощёлкивать. Грубо, но решение единственное. Этот вопрос закрыт. Да, и по предыдущему - я так и не понял, что влияет на вылет при заходе в двери. Тоже оставил прежнее грубое решение: вынес штатные двери, вставил свои, навесил активаторы. Против лома - нет приема! ;)

Добавлено (01 Июля 2020, 15:15)
---------------------------------------------
Здравствуйте, Майпризм! Возникла вот такая идея дальнейшего развития Скайрима, хотелось бы с Вами обсудить. Мотивация: сделать НПС поумнее и поинтереснее, при этом, сэкономив собственный труд программиста. Назовём её "Динамическое меню диалогов" (ДМД). Предположим, что в игре мы можем активировать у всякого НПС пункт меню "Давай поговорим о...", в котором можно будет строить ветки диалогов, за игрока, и за НПС. Всё это сохраняется в сэйве, но есть возможность и сгенерить в отдельном текстовом файле болванку скриптового кода. Который, уже можно будет, потом, нормально вставить в собственный мод и откомпилировать, навесив на пункты меню - соотв. действия героя и НПС, вместо пустышек-заглушек "никакого действия". Как Вам такая идея, реализуема ли она средствами скриптового языка?

С уважением.
Маг Иридий.
Myprism  Offline Сообщение №2935 написано: 01 Июля 2020 в 20:48


Физик


1615
yakor77, мне это очень далеко. Не дружу я с диалогами.

Dsion  Offline Сообщение №2936 написано: 01 Июля 2020 в 22:55 | Отредактировано: Dsion - Среда, 01 Июля 2020, 22:55



1285
yakor77, не вижу в идее никакой ценности. Все-равно дерево диалогов придется строить "классическим" способом и на реплики придется вешать отдельные скрипты. А потом уж как удобнее: либо сразу писать команды в скрипте реплики, либо вызывать из неё функцию на другом большом скрипте. Так все квесты работают.

yakor77  Offline Сообщение №2937 написано: 02 Июля 2020 в 15:09 | Отредактировано: Multigone - Четверг, 02 Июля 2020, 16:30


Странник


26
Цитата Myprism ()
yakor77, мне это очень далеко. Не дружу я с диалогами

Майпризм, понятно, спасибо за ответ. Сам подумаю над реализацией.
Смысл такой идеи в том, что дерево диалогов генерится в игре, в игровом контексте. А не абстрагированно, "по памяти", в редакторе. Это помогает не компилятору - это помогает человеку, его интуиции, его творческому началу. Чтобы диалоги получились точные и правильные, "к месту и времени". Примерно так.

С уважением.
Маг Иридий.
Dsion  Offline Сообщение №2938 написано: 02 Июля 2020 в 16:09



1285
нет таких функций в папирусе. максимум можно включать/отключать уже существующие реплики

frodo01  Offline Сообщение №2939 написано: 06 Июля 2020 в 20:00 | Отредактировано: frodo01 - Понедельник, 06 Июля 2020, 21:11


Странник


4
Здраствуйте, хотелось бы узнать скрипт в котором вампир проигрывал анимацию питания а потом выдавал спел своей жертве
например:
if akCaster.HasAnimation(VampireFeedingBedRight_Loose)
Victim.DoCombatSpellApply(Dis, Victim as objectreference)
endIf

Multigone  Offline Сообщение №2940 написано: 06 Июля 2020 в 21:29 | Отредактировано: Multigone - Понедельник, 06 Июля 2020, 21:46



647
frodo01, смотри перк VampireFeed - там фрагменты, запускающие этот процесс. Сами функции в скрипте PlayerVampireQuestScript квеста PlayerVampireQuest.

Если нужно просто поймать момент этой анимации, попробуй так (не точно так, это просто болванка для дальнейших экспериментов):
Код
RegisterForAnimationEvent(Game.GetPlayer(), "SoundPlay.NPCHumanVampireFeed")

Event OnAnimationEvent(ObjectReference akSource, string asEventName)
    IF asEventName == "SoundPlay.NPCHumanVampireFeed"
        Debug.MessageBox("SoundPlay.NPCHumanVampireFeed")
    ENDIF
EndEvent

風たちぬ今和歌春神髪
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Поиск: