Перейти к содержанию

Тонкости скриптов


Рекомендуемые сообщения

Неплохо бы изобрести способ получение текущей сложности игры.

А как в МФР сейчас работает автоматическая регулировка сложности? Если через MWSE (а оно так и есть, скорее всего), то есть способ, значит.

Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 339
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Не подскажет кто-нибудь, как точно работает функция GetPCTraveling?

Я пытаюсь аналогичную для OpenMW реализовать.

Сейчас подход такой:

1. Устанавливаем флаг при выборе назначения в меню путешествия

2. По прибытии на место GetPCTraveling будет возвращать 1 в течение одного кадра (из-за установленного флага).

В этом же кадре можно рассчитать разницу во времени до и после путешествия.

3. Скидываем флаг во втором кадре.

 

Оно примерно так должно работать, или там еще нюансы есть?

 

И работает ли GetPCInJail аналогично?

Вроде как-то так и работает. можно проверить, конечно, маленьким скриптиком. Обязательно в точности механику сохранить или сделать так как будет полезнее?

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

Подскажите пожалуйста, отчего функции AddSpell/RemoveSpell могут работать некорректно?
 

 

begin блаблабла

float timer
short once

if ( MenuMode == 1 )
return
endif

if ( once == 0 )
set once to 1
disable
elseif ( once == 1 )
if ( GetDistance, Player <= 500 )
enable
PlaySound3d, "RM_MM_cracklin"
DisablePlayerControls
MessageBox "Проклятье! Снова гром и снова странное оцепенение овладело мной. Но... что это там, впереди, у моста?" "ОК"
Journal "RM_MMQuest01" 4
set once to 2
endif
endif          весь блок выполняется корректно

if ( once == 3 )
return
endif

if ( once == 2 )
set timer to ( timer + GetSecondsPassed )
if ( timer >= 1 )
      addspell RM_MM_StartShock01              выполняется корректно
endif
if ( timer >= 2 )
      AddSpell RM_MM_StartSheo90
      RemoveSpell RM_MM_StartSheo100     выполняется корректно (кажется)
endif
if ( timer >=4 )
      AddSpell RM_MM_StartSheo80             Х           
      RemoveSpell RM_MM_StartSheo90      Х
      endif
if ( timer >=6 )
      AddSpell RM_MM_StartSheo70             Х            
     RemoveSpell RM_MM_StartSheo80       Х
endif
if ( timer >=8 )
      AddSpell RM_MM_StartSheo60             Х
      RemoveSpell RM_MM_StartSheo70      Х
     endif
if ( timer >=10 )
      AddSpell RM_MM_StartSheo50             Х
      RemoveSpell RM_MM_StartSheo60      Х      Х - не выполняется
endif
if ( timer >=12 )
      AddSpell RM_MM_StartSheo40             Х
      RemoveSpell RM_MM_StartSheo50      Х
endif
if ( timer >=14 )
      AddSpell RM_MM_StartSheo30             Х
      RemoveSpell RM_MM_StartSheo40      Х
endif
if ( timer >=16 )
      AddSpell RM_MM_StartSheo10             Х
      RemoveSpell RM_MM_StartSheo30      Х
endif
if ( timer >=18 )
      EnablePlayerControls                        выполняется корректно
endif
if ( timer >=20 )
      RemoveSpell RM_MM_StartSheo10    Х
      PlaySound3d, "RM_MM_cracklin"     выполняется корректно
      forcegreeting                                      выполняется корректно
      set once to 3
      Journal "RM_MMQuest01" 5             выполняется корректно
endif
endif

end

 


 
Спеллы - хамелеон100n, хамелеон90n, ...хамелеон10n, проклятья длительностью 3 с.
Мысль была в том, чтобы непись как бы материализовался из ничего: сначала у него 90%хамелеон, потом 80%, потом70% и т.д., пока хамелеон полностью не удалится. В игре же визуально непись остаётся просвечивающим в одной стадии, т.е. новые эффекты не добавляются, старые не удаляются.

Я пробовал и закавычивать спеллы, и удалял строки с RemoveSpell, но результат одинаковый.
Но таймер при этом работает корректно, т.к. последние указанные функции срабатывают вовремя. Если я на место хамелеона подставлю другой эффект - он срабатывает и это в игре видно.
В чём фишка? Как лечить?
Не может же игра путаться в почти одинаковых ID спеллов, одного знака различия должно быть достаточно?
 

Изменено пользователем РЕДМЕНЪ
Ссылка на комментарий
Поделиться на другие сайты

Попробуйте переписать скрипт в таком духе:

if ( timer >= 20 )
XXX
elseif ( timer >= 18)
XXX
XXX
elseif (timer >= 16)
XXX
XXX
endif

Я подозреваю, что дело в том, что каждый кадр добавляются сразу все заклятия и игрок просто не видит, как они удаляются.

Изменено пользователем Муурн Шепард
Ссылка на комментарий
Поделиться на другие сайты

Спеллы - хамелеон100n, хамелеон90n, ...хамелеон10n, проклятья длительностью 3 с.

А если сделать не проклятьями, а способностями?
Ссылка на комментарий
Поделиться на другие сайты

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

Делал спеллы и способностями, и характеристиками - с одинаковым результатом.
 

Я подозреваю, что дело в том, что каждый кадр добавляются сразу все заклятия и игрок просто не видит, как они удаляются.

Не совсем понимаю, почему должны добавляться сразу все спеллы, если им время указано?

Ссылка на комментарий
Поделиться на другие сайты

Не совсем понимаю, почему должны добавляться сразу все спеллы, если им время указано?

Потому что указано >=. Следовательно, заклятие добавляется/удаляется всякий фрейм, когда timer >=2. Это при 2 секундах, при 2.1, при 2.2, при 3, при 4 и т.д. При 4 секундах срабатывают уже три блока (один с шоком и два с хамелеоном), при 8 секундах -- пять блоков.

Поначалу как раз было elseif, но таймер не срабатывал, выполнялась первая часть скрипта и всё "замораживалось"

Elseif начинался с большего числа или с меньшего? Если с меньшего, то первым подходящим всегда было меньшее число.

Ссылка на комментарий
Поделиться на другие сайты

А, точно же. Ну-ка, попробую заново...


=====
UPD: Получилось, спасибо за помощь! Elseif надо начинать с большего числа, и тогда будет плавный переход от одного эффекта к другому; и старые эффекты также удаляются.

Но есть другая загвоздка. На непися повешен 100% хамелеон, характеристика. Но когда непись енейблится, он на мгновение становится полностью видимым, а потом пропадает (т.к. на нём 100% хамелеон), а потом скрипт его постепенно "проявляет". И вот это вот мгновение сразу после enable всё впечатление смазывает, увы. То же самое, если на неписе висит 100% невидимость. Можно это как-то обойти/исправить?

Изменено пользователем РЕДМЕНЪ
Ссылка на комментарий
Поделиться на другие сайты

Но есть другая загвоздка. На непися повешен 100% хамелеон, характеристика. Но когда непись енейблится, он на мгновение становится полностью видимым, а потом пропадает (т.к. на нём 100% хамелеон), а потом скрипт его постепенно "проявляет". И вот это вот мгновение сразу после enable всё впечатление смазывает, увы. То же самое, если на неписе висит 100% невидимость. Можно это как-то обойти/исправить?

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

Первое что в голову пришло, так-то может быть у проблемы есть и более правильное решение, не в курсе.

Ссылка на комментарий
Поделиться на другие сайты

Но есть другая загвоздка. На непися повешен 100% хамелеон, характеристика. Но когда непись енейблится, он на мгновение становится полностью видимым, а потом пропадает (т.к. на нём 100% хамелеон), а потом скрипт его постепенно "проявляет". И вот это вот мгновение сразу после enable всё впечатление смазывает, увы. То же самое, если на неписе висит 100% невидимость. Можно это как-то обойти/исправить?

Попробуй энаблить персонажа не прямо перед игроком а за углом и потом телепортируй к игроку.

Ссылка на комментарий
Поделиться на другие сайты

Но есть другая загвоздка. На непися повешен 100% хамелеон, характеристика. Но когда непись енейблится, он на мгновение становится полностью видимым, а потом пропадает (т.к. на нём 100% хамелеон), а потом скрипт его постепенно "проявляет". И вот это вот мгновение сразу после enable всё впечатление смазывает, увы. То же самое, если на неписе висит 100% невидимость. Можно это как-то обойти/исправить?

Можно скриптом совать персонажа под землю (SetPos Z -XXX), потом энейблить, а потом возвращать на нужные координаты Последнее даже сделать через один фрейм. Вариант неплохой, думаю.

Изменено пользователем Муурн Шепард
Ссылка на комментарий
Поделиться на другие сайты

Можно скриптом совать персонажа под землю (SetPos Z -XXX), потом энейблить, а потом возвращать на нужные координаты Последнее даже сделать через один фрейм.

Ой, как-то страшно звучит, я не уверен, что смогу такое. Я ж не волшебник, я токо учусь :).

 

Одеть в "невидимые" доспехи - надо запомнить такой вариант; но в данном случае не подходит, т.к. непись - кричер, его в доспехи не оденешь.

 

Пока я сделал самое простое, что догадался: у кричера невидимость (невидимость, а не хамелеон), енэйблится он вне видимости игрока, а проявляться начинает при GetDistance, Player <= 500.

 

Всем спасибо :).

Ссылка на комментарий
Поделиться на другие сайты

Мне для одного квестика хочется временно задать ГГ маленький рост. Сильно маленький, где-нить 0.3. Команда SetScale отлично справляется, но вот незадача: в виде "от первого лица" камера остаётся на прежнем уровне. Отсюда вопросы:

- Есть ли какие-нибудь команды для управления камерой? Возможно ли её опустить намного ниже, на нужную высоту?
- Возможно ли её потом вернуть обратно?
- Вообще насколько безопасны подобные манипуляции с камерой? или лучше её совсем не трогать?

Ссылка на комментарий
Поделиться на другие сайты

Мне для одного квестика хочется временно задать ГГ маленький рост. Сильно маленький, где-нить 0.3. Команда SetScale отлично справляется, но вот незадача: в виде "от первого лица" камера остаётся на прежнем уровне. Отсюда вопросы:

 

- Есть ли какие-нибудь команды для управления камерой? Возможно ли её опустить намного ниже, на нужную высоту?

- Возможно ли её потом вернуть обратно?

- Вообще насколько безопасны подобные манипуляции с камерой? или лучше её совсем не трогать?

 

Посмотри плагин Underground, там, емнип, все эти нюансы были учтены, там есть такая квестовая фишка, уменьшиться и пройти участок в интерьере.

Ссылка на комментарий
Поделиться на другие сайты

Знаю, что в снике уровень опускания камеры от первого лица регулируется GMST i1stPersonSneakDelta, но это только дельта понижения в снике, а не исходный уровень камеры.

Ссылка на комментарий
Поделиться на другие сайты

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

 

Есть скриптовая команда для форсированного переключения в режим от третьего лица, разве что.

Ссылка на комментарий
Поделиться на другие сайты

Посмотри плагин Underground, там, емнип, все эти нюансы были учтены, там есть такая квестовая фишка, уменьшиться и пройти участок в интерьере.

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

В скриптах искать - знать бы, что именно искать; там скриптов сотня, получается "ищу то, не знаю что".

Пока в скриптах наткнулся вот на такую конструкцию:

 

if ( Q_sotha_steam00->getPos z < 11942 )

        Q_sotha_steam00->moveWorld z, 20

    else

        set state to 10

    endif

 

м.б. вот это "переехать мир по оси Z" - то, что нужно?

 

 

Есть скриптовая команда для форсированного переключения в режим от третьего лица, разве что.

Я это знаю, пробовал уже. Камера переключается, но если нажимать на клавишу "от первого лица", всё возвращается.

В принципе, мне подошёл бы этот вариант, если найти способ временно отключить вид "от первого лица"; я пока не придумал, как.

 

http://pic.fullrest.ru/upl/t/N7HD48b3_250x250.jpg

 

 

=====

В интерьерах сделать персонажа маленького роста довольно просто - надо не перса уменьшать, а интерьер увеличивать: мебель, предметы обстановки etc. Работы много, но оно того стоит.

Но мне надо в экстерьерах, в открытом мире :mda:.

Изменено пользователем РЕДМЕНЪ
Ссылка на комментарий
Поделиться на другие сайты

м.б. вот это "переехать мир по оси Z" - то, что нужно?

Нет, это двигает объект по мировым координатам.

 

Я это знаю, пробовал уже. Камера переключается, но если нажимать на клавишу "от первого лица", всё возвращается.

В принципе, мне подошёл бы этот вариант, если найти способ временно отключить вид "от первого лица"; я пока не придумал, как.

DisablePlayerViewSwitch запрещает игроку переключать вид. По идее, должно сработать сначала PCForce3rdPerson, а потом DisablePlayerViewSwitch.

Или наоборот.

Ссылка на комментарий
Поделиться на другие сайты

Нет, это двигает объект по мировым координатам.

Я уже понял, подставил в игру :mda:.

 

 

DisablePlayerViewSwitch запрещает игроку переключать вид. По идее, должно сработать сначала PCForce3rdPerson, а потом DisablePlayerViewSwitch. Или наоборот.

Ага, спасибо, попробую.

Ссылка на комментарий
Поделиться на другие сайты

DisablePlayerViewSwitch запрещает игроку переключать вид. По идее, должно сработать сначала PCForce3rdPerson, а потом DisablePlayerViewSwitch.

Или наоборот.

 

Это 100% работает, похожий скрипт был в WI.

Ссылка на комментарий
Поделиться на другие сайты

Это работает. Вот так у меня, прописывал в Result в Диалогах, но возможно, позже перепишу в отдельный скрипт:
Player->SetScale 0.3
PCForce3rdPerson
DisablePlayerViewSwitch
 
Но потом встаёт другая важная задача: как правильно вернуть игроку прежний рост?
(камеру  "от первого лица" на прежнее место возвращать не нужно, т.к. она привязана к расе и остаётся неизменной)

Т.е. для вида "от третьего лица" игроку после завершения квеста необходимо прописать "SetScale *нужное значение*", а оно у каждой расы своё.
 

Есть ли какая-нибудь переменная/функция, отслеживающая рост, какой-нибудь условный GetHeight?
В учебнике GhanBuriGhan я не нашёл, возможно, невнимательно смотрел.

Одновременно: идея отслеживать рост по расе ГГ мне не кажется слишком хорошей, т.к. многие играют самодельными расами и пытаться организовывать для них проверку - лишний геморрой, источник конфликтов. Можно было бы для всех не-дефолтных рас выставить общее SetScale 1.0, но мне это не слишком нравится.
Отсюда и мысль - можно ли как-нибудь отслеживать рост ГГ/актёра?
 

Ссылка на комментарий
Поделиться на другие сайты

Но потом встаёт другая важная задача: как правильно вернуть игроку прежний рост?

(камеру  "от первого лица" на прежнее место возвращать не нужно, т.к. она привязана к расе и остаётся неизменной)

Т.е. для вида "от третьего лица" игроку после завершения квеста необходимо прописать "SetScale *нужное значение*", а оно у каждой расы своё.

Мне всегда казалось, что достаточно вернуть просто 1.0. То есть, что Height расы и Scale не одно и то же, а перемножаются друг на друга. Разве нет?
Ссылка на комментарий
Поделиться на другие сайты

Я не знаю, я спрашиваю :). Мне почему-то казалось, что 1.0 - это средний "человеческий" рост имперцев, 1.10 - альтмеров, 0.9 - босмеров и т.д.
Если я неправ, то всё становится намного проще.

Ссылка на комментарий
Поделиться на другие сайты

Я не знаю, я спрашиваю :). Мне почему-то казалось, что 1.0 - это средний "человеческий" рост имперцев, 1.10 - альтмеров, 0.9 - босмеров и т.д.

Если я неправ, то всё становится намного проще.

 

Емнип с МСР 2.3+ достаточно просто 1.0.

Ссылка на комментарий
Поделиться на другие сайты

Я не знаю, я спрашиваю :). Мне почему-то казалось, что 1.0 - это средний "человеческий" рост имперцев, 1.10 - альтмеров, 0.9 - босмеров и т.д.

Рост такой. Но это Height (а ведь есть еще Weight, а ведь скрипты несимметрично маштабировать объекты не умеют), а не Scale.

 

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

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...