• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
К сожалению, выложенный мною ранее скрипт нельзя считать полностью рабочим. Пока стоишь рядом с часами, выходишь из дома и заходишь обратно - скрипт пашет. А вот стоит переместиться в другую локацию, провести там время и вернуться - все останавливается. Решил проблему привязкой второго скрипта, который ресетит часы, типа нужно их заводить время от времени. Вот только не знаю - не накладывается ли при этом запущенный ранее скрипт на повторно запускаемый при заводе. Скрипт, в принципе, один и тот же, но может ли он запускаться несколько раз параллельно, нагружая при этом комп и сохранения, или при каждом новом запуске он убивает предыдущий процесс? Вот в чем вопрос
Повторю вопрос. Как вернуть состояние скрипта к начальному - в смысле, допустим, есть вариант выбора, одни варианты отправляют св следующее состояние командой GotoState "ИмяСостояния", а один из вариантов - наоборот, возвращает в начальное. Когда я ставлю команду GotoState "Begin" (у меня обозначено начальное состояние Auto State Begin), именно эта команда не компилируется - хотя остальные отправки к следующим состояниям работают.
Ну вообще-то для простеньких скриптов то что надо. Только вот почему при попытке заставить их прийти обратно к началу какой-то бунт... Короче, как вернуть все к исходному состоянию самым коротким путем?
О, кажется, нашел. Если состояние вообще не объявлять, то можно в начальном событии активации указать переход в состояние, а в вариантах внутри состояния один обозначить как переход к пустому состоянию, то есть фактически к блоку вне состояний. Скрипт скомпилировался, посмотрим, будет ли он работать.
Да, работает.
Правда, теперь возник следующий вопрос - я вот спрашивал про modactorvalue - оказывается, это не то, что мне было нужно. Эта функция "подзеленивает" навыки - то есть изменяет результирующий навык, не меняя базового. А тогда какой командой можно повысить навык, допустим, как в обучении? Setactorvalue? тогда надо как-то написать типа setactorvalue("Lockpicking") = getactorvalue("Lockpicking") + 1? Как это написать правильно?
Ага. Методом господина Тыка нашел скомпилировавшийся вариант float Lockpickingvalue Lockpickingvalue = GetPlayer().GetBaseActorValue("Lockpicking") + 1 GetPlayer().SetActorValue("Lockpicking", Lockpickingvalue)
Интересно, он будет работать как повышение навыка с объявлением, что навык повысился и вкладом в повышение уровня?
Добавлено (26 Февраля 2015, 01:45) ---------------------------------------------
Цитата Dsion
Извини. Просто Папирус - единственный язык из мне знакомых, в котором есть эти состояния. А я привык обходиться без них и не вижу в них смысла.
В Обливионе роль состояний выполняли переменные - назначаешь следующее значение переменной и соответствие функций этому значению - и скрипт работает по другому, чем при другом ее значении. Здесь фактически то же самое, но переменных не объявляешь, а отправляешь действие скрипта в разные блоки состояний. Для начинающих как раз удобно - меньше надо думать Пожалуй, единственный момент Папируса, более удобный для новичков. Все остальное - я долго ахал и охал, когда узнал, что он бюрократически запрашивает проперти и отказывается признавать функцию, если она в пропертях не указана
Добавлено (26 Февраля 2015, 01:49) --------------------------------------------- Опять немного не то. Повышение навыка теперь не "зеленое", а "белое", но влияния на повышение уровня нет. И какой же командой повысить навык так, чтобы это работало как повышение навыка в обучении?
Я так и не понял как добавить случайному нпс при диалоге, пакет на сопровождение, а потом корректно его убрать. Можно без наворотов, просто тупо должен идти за гг, а потом(через диалог же) вернутся к своим делам.....
Создать в квесте пустой алиас с пометкой Optional, повесить на алиас пакет. А потом при помощи скрипта совать туда NPC: MyAlias.ForceRefTo(akSpeaker) и убирать из него NPC: MyAlias.Clear()
Пакеты на алиасах приоритетнее пакетов на самом NPC. А если NPC сразу в нескольких алиасах с пакетами, то приоритет пакетов будет зависеть от приорититов квестов.
Изменение репутации для пользователя Holtof55
Holtof55Offline
Сообщение №1451
написано: 26 февраля 2015, 17:43
| Отредактировано: Holtof55 - 26 февраля 2015, 17:43
Добавлено (26 Февраля 2015, 20:43) --------------------------------------------- Dsion, Все о'кейно! Супер, спасибо!
Еще один вопросик махонький, если позволите...какую команду надо вставить в срипт, чтобы проигралась музыка? И играла пока идет анимация, или сцена... Сама музыка есть, добавлена а локацию, и когда игрок туда попадает, играет, то есть формат правильный, wav
Изменение репутации для пользователя slastik
slastikOffline
Сообщение №1452
написано: 27 февраля 2015, 08:07
| Отредактировано: slastik - 27 февраля 2015, 09:07
Еще один вопросик махонький, если позволите...какую команду надо вставить в срипт, чтобы проигралась музыка?
В тело скрипта: MySound. Play() И в свойствах: Sound Property MySound auto
Добавлено (27 Февраля 2015, 11:07) --------------------------------------------- И снова здравствуйте. Где те люди, которые советовали мне создать для часов анимированную модель? Я сделал тестовую модель, состоящую из одной стрелки, которая делает полный оборот за 24 игровых часа (4320 секунд). Как теперь мне синхронизировать эту анимацию с игровым временем? Допустим, я привяжу скрипт, в котором через Event OnInit() задам поворот модели по оси на определенный градус относительно циферблата в зависимости от текущего времени. Это даст часам правильную стартовую позицию. Но как быть дальше? Анимация останавливается при выходе из локации и запускается с нуля при входе, анимация не реагирует на пропуск времени и сон, продолжая с того же места, хотя прошло N игровых часов. Кто-то говорил, что с такой моделью можно обойтись вообще без скриптов. Подскажите - как?
slastik, на всякий случай, напомню, что скорость течения игрового времени зависит от глобальной переменной. В 20 раз быстрее - это значение по-умолчанию, но многие его меняют.
Кроме ивента OnInit(), на ObjectReference есть еще много других ивентов. Например, OnLoad(), который выполняется каждый раз, когда загружается моделька объекта и становится готовой для анимации.
В том скриптике, что я выкладывал, стрелка движется не плавно. Она каждые секунд 10 синхронизируется со временем и прыгает на 1...2 градуса. Но можно сделать и иначе: одну синхронизацию со временем в момент загрузки модели, а потом запуск анимации поворота с нужной скоростью (анимации не из NIF, а при помощи функции TranslateTo). Но в этом случае, нужно еще получать значение глобальной переменной скорости времени и использовать для расчета скорости поворота стрелки.
Dsion, на счет OnLoad - хорошая идея, спасибо. Как это она мне в голову не пришла...
Добавлено (27 Февраля 2015, 14:18) --------------------------------------------- Dsion, нет, все равно при длительном пропуске времени все идет наперекосяк. Проблема в том, что когда регистрируется SingleUpdateGameTime и ГГ, к примеру, ложится спать, то момент следующего обновления эвента проходит во время сна, соответственно следующий эвент не регистрируется и т.о. цикл сбивается. А OnLoad при пробуждении не срабатывает. Спасибо за участие, но наверно это гиблая идея.
P.S. Единственное, что приходит в голову, - это добавить еще один эвент OnActivate, чтобы гг мог вручную ресетить время, если часы сбились.
Здравствуйте, есть еще один момент, который мне не удается решить самостоятельно. Я запускаю музыку через скрипт, который запускает и анимацию, в конце анимации добавляется некое событие, отмеченное keyword-ом,теперь я хочу вписать условие в скрипт, что если сработал этот keyword, то музыка должна остановится(команду на стоп я знаю) в общем нужно синхронизировать старт и стоп музыки. Со стартом проблем нет, но вот со стопом есть, я пока использую утилиту на паузу,но это не круто, надо сделать по keyword Кто-то сможет подсказать?
Здравствуйте, есть еще один момент, который мне не удается решить самостоятельно. Я запускаю музыку через скрипт, который запускает и анимацию, в конце анимации добавляется некое событие, отмеченное keyword-ом,теперь я хочу вписать условие в скрипт, что если сработал этот keyword, то музыка должна остановится(команду на стоп я знаю) в общем нужно синхронизировать старт и стоп музыки. Со стартом проблем нет, но вот со стопом есть, я пока использую утилиту на паузу,но это не круто, надо сделать по keyword Кто-то сможет подсказать?
slastik, я же выложил работающий проверенный скрипт. Я его цеплял к сундуку и сундук всегда поворачивался как нужно. Спать рядом с ним не пробовал, но пропусков времени делал много и большие. Если при каких-то условиях скрипт работает не правильно, я уверен, что это можно легко исправить.
Могу показать еще один вариант, который чуть иначе работает...
Dsion, речь идет о пропуске времени рядом с объектом, к которому привязан скрипт. Если пропускать время в другой локации, то по возвращению вновь сработает OnLoad и все наладится, а вот если находиться рядом, когда объект уже загружен - то цикл сбивается. Это происходит когда пропуск времени или сон по длительности больше, чем время, которое задано для обновления события в скрипте. Если в этот промежуток, когда актер пропускает время или спит, должен сработать следующий Event OnUpdateGameTime - то он не сработает. В результате скрипт зависает на этапе до пропуска времени +1. В моем случае часы находятся в доме, где установлена кровать ГГ. Один из возможных выходов - вынести часы на улицу, но это уже не то
Так говорю же: попробуй мой скриптик. Там нету такой проблемы. Сразу после сна/пропуска они синхронизируются со временем.
Добавлено (27 Февраля 2015, 16:23) --------------------------------------------- Если игрок спит в то время, когда должно произойти обновление, то обновление все-равно произойдет, но когда он проснется.
Изменение репутации для пользователя slastik
slastikOffline
Сообщение №1460
написано: 27 февраля 2015, 13:52
| Отредактировано: slastik - 27 февраля 2015, 13:59
Dsion, If (!Is3DLoaded()) Return EndIf Что дает это условие в твоем скрипте? Если модель уже загружена - возврат к предыдущему этапу?
И проверь при возможности свой скрипт на наличие моей проблемы. Целиком я его взять не могу. Приходится адаптировать, потому как мне недостаточно просто вращать, мне еще нужно выравнивать при загрузке относительно текущего игрового времени. Это же часы, а не просто вентилятор
Если в момент, когда должна произойти синхронизация, модель не загружена, всё сразу прерывается. Не происходит синхронизация и не происходит регистрация для следующего обновления. То есть, часы не работают, пока игрок в другой локации. Вообще ничего не происходит. А возобновится ход только когда снова произойдет загрузка модели.
Именно целиком его и стоило бы взять (для начала)... Ничего туда дописывать не нужно. Только развернуть стрелку так, чтоб при угле Z = 0 она показывала на "12".
Изменение репутации для пользователя Holtof55
Holtof55Offline
Сообщение №1464
написано: 27 февраля 2015, 14:06
| Отредактировано: Holtof55 - 27 февраля 2015, 14:07
В момент загрузки модели, стрелка сразу синхронизируется со временем. А потом синхронизируется каждые 0.05 игрового часа и так аж до выгрузки модели. Если игрок нажмет "T" и прождет какое-то время, стрелка синхронизируется сразу после конца ожидания. Со сном, скорее всего, так же.
Dsion, с вращением стрелки вокруг оси Z проблем нет, но при попытке вращать ее вокруг оси Y возникают проблемы, стрелка произвольно поворачивается в разных направлениях, уходя за циферблат. Я нарочно подогнал модель так, чтобы она как раз была в нужном положении при установке - и стрелка, и циферблат установлены в редакторе с углами 0 относительно игровых осей. Так что ваш скриптик у меня не работает. Не знаю еще что тут можно сделать.
Но зато переделал свой скрипт по вашему принципу. Убрал к черту состояния и просто вписал все в один эвент с синхронизацией в 0,1. Теперь все работает нормально, видимо зависания скрипта происходили именно из-за наличия множества состояний.
Да всё там нормально... Стрелка должна вращаться всегда именно по оси Z. Но эту ось Z можно развернуть как угодно. Часы могут и на полу лежать (осью Z вверх), и на стене висеть (осью Z в сторону игрока перпендикулярно стене) и как угодно еще... Ладно, сам смотри.
Стрелка должна вращаться всегда именно по оси Z. Но эту ось Z можно развернуть как угодно.
Теперь понятно Я просто думал, что под осью Z имеется в виду ось Z системы координат локации. А получается, что это ось Z самой модели. Ладно, на будущее учту, еще раз спс
- Что это за горы стоят? - А, это орки бегут!
Изменение репутации для пользователя lolososo
lolososoOffline
Сообщение №1469
написано: 27 февраля 2015, 19:22
| Отредактировано: lolososo - 27 февраля 2015, 19:22
lolososo, спасибо, попробую! Еще один момент, как запустить проверку, есть ли на нпс(актере) действующий магический эффект(эффект определенный, а не абы какой)
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)