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

OpenMW или мечты иногда сбываются


MEZON

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

Официальный сайт OpenMW
Страница загрузки
Ссылка на загрузку актуального билда для Win64 (обновляется ежедневно)
 
Баг-трекер

Wiki

Список задач до релиза 1.0

Репозиторий с исходным кодом на GitLab

Discord: OpenMW (в наличии русскоязычный канал)
IRC: #openmw на irc.freenode.net

Полезные ссылки:
Реестр популярных модов для OpenMW с гайдами по установке
Руководство по портированию ретекстуров в OpenMW
OpenMW на Youtube
OpenMW на GitLab
Диздоки планов развития после 1.0
 
Сторонние проекты, основанные на OpenMW:
TES3MP - реализация мультиплеера для OpenMW.

Тема OpenMW на 4PDA - здесь можно найти сборки OpenMW для Android 5+ и гайды по решению проблем.

OpenMW для VR - основан на OpenXR, готовые сборки (устаревшие) есть только для Windows.

Порт на Switch - к сожалению, в настоящее время им никто не занимается.

Что такое OpenMW?

  Показать контент

 
Я не программист, как я могу помочь проекту?

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

  • 3 месяца спустя...
  • Ответов 3.1 тыс
  • Создана
  • Последний ответ

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

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

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

UnPinned posts
  В 1/2/2018 в 12:01 PM, Capostrophic сказал:

Тем временем Zini считает, что релиз 1.0 будет в этом году — причём всерьёз считает — и заявляет, что выпустит диздок по пост-1.0 весной.

Интересно что дальше будет? Хотелось бы, чтоб функции MWSE добавили, для простоты переноса всяких репаков (в частности Фуллрестовского). Я понимаю, что свое запихнут ( офигенно лучшее), но нафига изобретать велосипед. Хотя это взгляд дилетанта.

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

  В 12/16/2017 в 4:55 AM, mortuus сказал:

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

 

Есть еще какие идеи?

 

Также Allofich пишет, что StartScript вообще прерывает выполнение скриптов в текущем кадре. Это так?

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

  В 1/2/2018 в 1:35 PM, akortunov сказал:

Есть еще какие идеи?

 

Также Allofich пишет, что StartScript вообще прерывает выполнение скриптов в текущем кадре. Это так?

Ни разу не замечал чтоб эта команда прерывала скрипты.

 

Судя по тому что написано по ссылке https://bugs.openmw.org/issues/3823 Там дело не в последовательности выполнения скриптов а в непонимании работы функции cellchanged.

cellchanged устанавливается в 1 в момент смены локации. Локальные скрипты ловят это в момент входа в локацию, в первом кадре, даже если это первый вход игрока в локацию. А глобальные скрипты ловят это в в момент выхода из локации.

 

  Цитата

A problematic part of AM_Bard2_script:

if GetDisabled == 0

if Reposition == 0

if ( PLayonce == 0 )

startScript AM_StopMusic_Script ; <- the problem is here

set Rand to random 10

if Rand < 5

StreamMusic,"AM\AM_music2.mp3"

set playonce to 2

set timer to 0

else

StreamMusic,"AM\AM_music3.mp3"

set playonce to 3

set timer to 0

endif

endif

endif

endif

AM_StopMusic_Script:

begin AM_StopMusic_Script

 

short Rand

 

if cellchanged == 1

set Rand to random 7

if Rand == 0

StreamMusic "Explore\MX_explore_1.mp3"

elseif Rand == 1

StreamMusic "Explore\MX_explore_2.mp3"

elseif Rand == 2

StreamMusic "Explore\MX_explore_3.mp3"

elseif Rand == 3

StreamMusic "Explore\MX_explore_4.mp3"

elseif Rand == 4

StreamMusic "Explore\MX_explore_5.mp3"

elseif Rand == 5

StreamMusic "Explore\MX_explore_6.mp3"

elseif Rand == 6

StreamMusic "Explore\MX_explore_7.mp3"

endif

stopScript AM_StopMusic_Script

endif

 

end

Morrowind behaviour:

  1. PC enters a cell (cellchanged sets to 1)
  2. AM_Bard2_script starts a music and starts AM_StopMusic_Script (but this script is not executed on current frame)
  3. Next frame starts (cellchanged sets to 0)
  4. AM_StopMusic_Script runs, but doing nothing (because cellchanged = 0)
  5. PC leaves the cell (cellchanged sets to 1)
  6. AM_StopMusic_Script correctly stops the music and stops itself

OpenMW behaviour:

  1. PC enters a cell (cellchanged sets to 1)
  2. AM_Bard2_script starts a music and starts AM_StopMusic_Script
  3. AM_StopMusic_Script runs in current frame and stops a music and stops itself (because cellchanged = 1)

 

В OpenMW судя по всему cellchange реально равна 1 в первом кадре, локальные и глобальные скрипты ловят это, отсюда и баг.

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

  В 1/2/2018 в 3:04 PM, Larkin сказал:

cellchanged устанавливается в 1 в момент смены локации.

 

OpenMW ведет себя точно также.

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

Сейчас эта переменная сбрасывается после выполнения всех скриптов, но перед обновлением мира (в обновлении мира идет собственно смена локации, переменная в этом случае будет установлена в 1).

Соответственно, в фазе скриптов после захода в локацию все еще 1.

 

  В 1/2/2018 в 3:04 PM, Larkin сказал:

Локальные скрипты ловят это в момент входа в локацию, в первом кадре, даже если это первый вход игрока в локацию. А глобальные скрипты ловят это в в момент выхода из локации.

 

Не вижу ни одной причины для подобного поведения:

  В 12/13/2017 в 4:23 PM, Larkin сказал:

Насколько я знаю скрипты запускаются в каждом кадре не в алфавитном порядке а в порядке их создания в редакторе (в порядке их внутренних ID). При этом вроде нет разницы глобальный\локальный скрипт.

 

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

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

  В 1/2/2018 в 3:21 PM, akortunov сказал:

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

 

Скрипты выполняются так:

  Цитата
Сначала работают локальные в алфавитном порядке объектов на которых висят. Потом глобальные в порядке из запуска с помощью startscript а не в алфавитном.

 

Касательно приведенных двух скриптов, я вижу вот что:

Оригинальный Морр:

 

1 Смена локации: глобальные скрипты поймали бы cellchanged == 1

2 Первый кадр новой локации: локальные скрипты поймали cellchanged == 1

3 локальный скрипт запустил глобальный

4 глобальный скрипт сработал и выдал cellchanged == 0

5 закончился первый кадр

 

OpenMW

1 Смена локаций: ничего не происходит cellchanged == 0

2 Первый кадр: локальные скрипты поймали cellchanged == 1

3 локальный скрипт запустил глобальный

4 глобальный скрипт сработал и выдал cellchanged == 1

5 закончился первый кадр

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

  В 1/2/2018 в 3:57 PM, Larkin сказал:

 

Это вообще хоть где-то документировано? Везде написано, что CellChanged = 1 при заходе в локацию. Про разницу в поведении локальных и глобальных скриптов я ничего не нашел.

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

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

  В 1/2/2018 в 4:10 PM, akortunov сказал:

Это вообще хоть где-то документировано? Везде написано, что CellChanged = 1 при заходе в локацию. Про разницу в поведении локальных и глобальных скриптов я ничего не нашел.

 

Ну можете сами протестировать если не верите, я вот только потестил и это конечно очень странно но это так. Глобальный скрипт получается отловил cellchanged==1 до наступления первого кадра в локации и соответственно глобальные скрипты выполнились до локальных.

 

Думаю что глобальные скрипты отлавливают cellchanged == 1 в последнем кадре той локации из которой игрок переходит. Но я даже не представляю как нужно скрипт написать, чтобы это проверить.

 

upd: ой сорри за мультипост, думал соединятся.

 

Ничего, но на этот случай есть кнопка "Удалить". Scarab-Phoenix

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

  В 1/2/2018 в 4:18 PM, Larkin сказал:

Ну можете сами протестировать если не верите.

 

Потестил таким скриптом:

begin TestScript
if ( cellchanged == 1 )
	 StreamMusic "Explore\MX_explore_6.mp3"
endif
end

 

Запускаю скрипт через консоль: RunScript TestScript. Это же глобальный скрипт?

Музыка сменяется после смены локации, как и положено. ЧЯДНТ?

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

Ну все правильно, локальный скрипт еще создайте, и выводите на экран какую нибудь переменную, чтобы проверить какой сначала скрипт выполнится при входе в локацию.
Ссылка на комментарий
Поделиться на другие сайты

  В 1/2/2018 в 4:53 PM, Larkin сказал:

Ну все правильно, локальный скрипт еще создайте, и выводите на экран какую нибудь переменную, чтобы проверить какой сначала скрипт выполнится при входе в локацию.

 

Чтобы проверить сброс переменной, порядок скриптов не важен. В моем тестировании локальный и глобальный скрипт обрабатывали переменную cellchanged одинаково, что в Морровинде, что в OpenMW - скрипт срабатывал после захода в локацию, но никак не при выходе из нее.

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

Не уверен, как это правильно описать, но наблюдаются какие-то проблемы с enable/disable НПС. Квестовые моды вроде Ризомы, где НПС часто исчезают в одном месте и появляются в другом - не работоспособны.
Ссылка на комментарий
Поделиться на другие сайты

  В 1/2/2018 в 5:49 PM, Ao3 сказал:

Не уверен, как это правильно описать, но наблюдаются какие-то проблемы с enable/disable НПС. Квестовые моды вроде Ризомы, где НПС часто исчезают в одном месте и появляются в другом - не работоспособны.

В OpenMW? В какой версии?

В чем конкретно выражаются "какие-то проблемы"? Телепортационные команды неправильно работают?

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

  В 1/2/2018 в 5:37 PM, akortunov сказал:

Чтобы проверить сброс переменной, порядок скриптов не важен. В моем тестировании локальный и глобальный скрипт обрабатывали переменную cellchanged одинаково, что в Морровинде, что в OpenMW - скрипт срабатывал после захода в локацию, но никак не при выходе из нее.

 

 

Вот два скрипта, первый локальный второй глобальный

Begin LRCellchange

 

if cellchanged == 1

messagebox "CELLLCHANGEEDD %g", LR_y

set LR_y to ( LR_y + 1)

endif

 

 

End

 

 

Begin LRCellchange2

 

if cellchanged == 1

messagebox "CELLLCHANGEEDD2222222 %g",LR_y

set LR_y to ( LR_y + 1)

endif

 

End

 

Тест показал, что при смене локаций первым срабатывает глобальный. Попробуйте на OpenMW

 

  В 1/2/2018 в 4:10 PM, akortunov сказал:

Это вообще хоть где-то документировано? Везде написано, что CellChanged = 1 при заходе в локацию.

 

Вот же, написано в MSFD:

  Цитата

CellChanged returns 1 for one frame when player changes cells. It doesn’t return 1 for scripted teleporting or magic teleporting. CellChanged returns true almost immediately after the player changes cells. This means a local script running in an interior cell won't fire when the user leaves a cell, but rather when the player enters the cell.

 

Scripted teleporting may trigger CellChanged if the script is global or targeted (local scripts will not trigger it). (Forum info / Zennorious, Tamandra)

 

Note:

CellChanged doesn't always trigger, even if the player enters the cell via a normal teleport door. Possibly scripts running in the cell can have some effect on this, somehow. ForceGreeting seems to muck it up in particular (and no there wasn't a menumode return in that script).

Тут все правильно написано. CellChanged возвращает 1 во время смены локаций, и глобальные скрипты именно в этот момент и отлавливают его.

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

Ну так у вас же написано:

  В 1/2/2018 в 6:01 PM, Larkin сказал:

CellChanged returns true almost immediately after the player changes cells.

 

Именно так OpenMW и работает. А изначальный посыл, как я понял, был в том, что эта переменная сбрасывается где-то между выполнением локальных и глобальных скриптов.

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

 

Как я уже писал выше, в моем тестировании что локальный, что глобальный скрипт выполнялись уже в свежезагруженной локации.

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

  В 1/2/2018 в 6:28 PM, akortunov сказал:

Ну так у вас же написано:

 

Именно так OpenMW и работает.

 

Тогда как вы объясните то что при входе глобальные скрипты отлавливают cellchanged==1 прежде чем это сделают локальные скрипты?

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

  В 1/2/2018 в 6:44 PM, Larkin сказал:

Тогда как вы объясните то что при входе глобальные скрипты отлавливают cellchanged==1 прежде чем это сделают локальные скрипты?

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

 

Согласно описанию, cellchanged==1 только один кадр, за который должны успеть отработать как локальные, так и глобальные скрипты. Почему они работают в обратном порядке - хороший вопрос.

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

  В 1/2/2018 в 5:53 PM, akortunov сказал:

В OpenMW? В какой версии?

В чем конкретно выражаются "какие-то проблемы"? Телепортационные команды неправильно работают?

 

В 0.43. Выражаются в том, что НПС, которые должны "появляться" командой Enable, не появляются, "исчезать" командой Disable - не исчезают.

 

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

 

Ещё проблемы с плагином Travellers, рандомные НПС либо не появляются вообще, либо появившись, не идут туда куда должны.

 

В плагине "Путешествующие торговцы" http://www.fullrest.ru/files/travelingmerchants те же проблемы с передвижением, плюс в единственном квесте НПС не реагирует, когда к нему подводишь его потерявшегося гуара.

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

  В 1/2/2018 в 7:22 PM, Ao3 сказал:

 

Спасибо за наводку. Постараюсь завтра глянуть.

 

  В 1/2/2018 в 7:22 PM, Ao3 сказал:

Выражаются в том, что НПС, которые должны "появляться" командой Enable, не появляются, "исчезать" командой Disable - не исчезают.

Возможно, там сами условия обрабатываются криво: вы выполняете через консоль Enable, а скрипт в том же кадре выполняет Disable, хотя и не должен.

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

  В 1/2/2018 в 12:47 PM, CemKey сказал:

Интересно что дальше будет? Хотелось бы, чтоб функции MWSE добавили, для простоты переноса всяких репаков (в частности Фуллрестовского). Я понимаю, что свое запихнут ( офигенно лучшее), но нафига изобретать велосипед. Хотя это взгляд дилетанта.

их будет не так уж и сложно дописать в основной массе.

Многие вещи, доступные в МВСЕ, будут доступны нативно, изменится только синтаксис.

  В 1/2/2018 в 6:01 PM, Larkin сказал:

Тест показал, что при смене локаций первым срабатывает глобальный

имхо, это логично, что глобальное имеет приоритет над локальным. Но если глобальный скрипт выполняется после выхода из локации, а локальный - при входе в новую, и именно это означает "приоритет", то это костыль. Как-то странно было бы переносить его в опенМВ. CellChanged означает как бы факт смены локации, который определяется фактом появления героя в новой локации взамен старой, а не фактом покидания старой локации - ведь можно, гипотетически, снова зайти в старую же.
Ссылка на комментарий
Поделиться на другие сайты

  В 1/2/2018 в 7:22 PM, Ao3 сказал:

 

Небольшой отчет по этим плагинам:

1. Rhizoma:

У Мантаса не компилируется его скрипт из-за дефиса в названии. Проблема известна и помечена как "починить до выхода 1.0".

Как временный костыль, можно заменить дефисы в названиях, например, на нижние подчеркивания.

 

2. Travellers:

Работает более-менее нормально, но есть нюансы:

2.1. Некоторые скрипты не компилируется. Например, OpenMW вполне справедливо ругается, что в скрипте Travellers_Resp_Aldr_out используются необъявленные переменные.

Можно довольно быстро починить, ориентируясь на выхлоп консоли.

2.2. ИИ изредка начинает ходить кругами вокруг какой-нибудь путевой точки. Проблема давно известна и помечена как "починить до выхода 1.0".

 

3. "Путешествующие торговцы"

Все новые неписи создаются и путешествуют, но есть нюансы:

3.1. Караван с гуарами возле Кальдеры не хочет собираться в кучу. После выполнения команды "ra" караван начинает движение в сторону города.

Собирать караван в кучу должен скрипт на 800+ строк, подключенный к погонщику гуаров. Я не плагиностроитель и не могу сказать, правильно этот скрипт работает, или нет.

3.2. Теоретически плагин должен быть подвержен проблеме 2.2, но так как новых неписей здесь кот наплакал, то проблему можно и не встретить.

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

  В 1/2/2018 в 7:02 PM, akortunov сказал:

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

 

Согласно описанию, cellchanged==1 только один кадр, за который должны успеть отработать как локальные, так и глобальные скрипты. Почему они работают в обратном порядке - хороший вопрос.

 

Есть три варианта почему так:

1 Это костыль. При входе осуществляется принудительный запуск глобальных скриптов. Зачем?

 

2 Существует какой то кадр в котором игрок уже покинул ячейку но еще не вошел в новую(локальные скрипты еще не начали работу). В этом кадре глобальные скрипты невозбранно отработали.

 

3 Имело место массовое заблуждение всех скриптописателей. На самом деле в каждом кадре глобальные скрипты работают перед локальными =-O. Вот утверждают же люди что ГМО=зло, таких даже гораздо больше, так что не стоит списывать массовое помешательство.

 

В 1 и 2 не очень верится, потому что в этом случае флаг cellchanged должен сбросится где то в середине кадра, после того как отработали локальные скрипты и до того как начали работать глобальные. Это крайне странно.

Но если принять 3 то все обретает четкую логику, cellchanged установился в начале первого кадра, сначала глобальные это отловили, затем локальные и в конце кадра он сбросился.

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

  В 1/3/2018 в 2:10 PM, akortunov сказал:

 

Спасибо за разъяснения. В странствующих торговцах не сработал ещё квест возвращения гуара Жвачки. Так понимаю что это место:

 

 

if ( guarreunion == 0 )
if ( GetDistance HB_guar_pack_Tiberus_ < 700 )
	if ( state != -20 )
		set guarreunion to 1
		HB_guar_pack_Tiberus_ -> AIFollow HB_tiberus_poreian, 0, 0, 0, 0
		set state to 1000 ;******************** start travel script from here
		ForceGreeting
	endif
endif
endif

 

В скрипте _HB_Tiberus_Travel.

Тибериус просто не видит что гуар рядом, не важно кого к кому подвести.

Определение дистанции нормально работает?

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

  В 1/5/2018 в 6:04 AM, Ao3 сказал:

Определение дистанции нормально работает?

 

Да никто раньше не жаловался. Можно проверить через консоль, если что: дистанция 700 это примерно 10 метров.

 

HB_tiberus_poreian->GetDistance HB_guar_pack_Tiberus_

 

Также можно посмотреть, как реализованы квесты на эскорт в Морровинде. По идее, если определение дистанции не работает, то они должны быть сломаны тоже.

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

  В 1/5/2018 в 6:04 AM, Ao3 сказал:

 

Нашел, в чем проблема. У торговца скрипт не компилируется из-за двух команд:

AddItem 0_backpack armor, 1
RemoveItem 0_backpack armor, 1

 

OpenMW использует пробел в качестве разделителя между аргументами. Нужно проставить кавычки:

AddItem "0_backpack armor", 1
RemoveItem "0_backpack armor", 1

 

Тогда скрипт будет работать. Я вообще не представляю, почему эти команды работают в Морровинде.

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

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

 

Upd: не уверен, связано это с OpenMW или мультиплеером, но напишу сюда. После диалога с Эламом Андасом не появилась "dreamer prophet" (видящая, убившая двух ординаторов и пять чужеземцев в Вивеке). В диалоге ее должно enabl'ить, однако этого не произошло.

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

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

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

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

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

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

Войти

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

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

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