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

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?

 

OpenMW - это попытка воссоздать игровой движок для популярной RPG TES3 Morrowind, полноценную реализацию всех особенностей игры с открытым исходным кодом. Для того, чтобы вы имели более полное представление о проекте, вот ключевые особенности OpenMW:

  • Кроссплатформенность - запуск на Windows (7 или новее), Linux, MacOS X, Android (платформы x86 не поддерживаются).
  • Виртуальная файловая система, позволяющая устанавливать моды в отдельные директории, а не засорять Data Files.
  • Поддержка сжатых BSA-архивов для экономии места на диске.
  • Исправление ошибок системного проектирования: "грязные" GMST записи в плагинах, проблема "удвоения" в сейвах, лимит на 255 плагинов и т.д.
  • Улучшенный поиск пути - с помощью статического или динамического (на выбор) построения навигационной сетки на основе геометрии локаций (вместо использования вручную расставленных дизайнерами локаций маркеров).
  • Улучшение интерфейса (поддержка TrueType-шрифтов, масштабирования интерфейса и миникарты, поддержка текстур высокого разрешения для элементов интерфейса, редактирования разметки интерфейса с помощью XML-файлов, клавиатурной навигации, поворота камеры с помощью гироскопов и т.д.).
  • Улучшение графики (поддержка шейдеров постобработки, динамические тени от объектов, Distant Land (хоть и без генератора LOD-ов), анимированная трава, шейдер воды с поддержкой отражений в реальном времени, улучшенная система освещения без лимита в 8 источников света на объект, улучшенная система тумана и многое другое).
  • Улучшенная поддержка анимаций (возможность использовать отдельные файлы для отдельных групп анимаций, возможность добавлять кастомные кости в скелеты, возможность задать новые анимации для топоров, булав и кинжалов, поддержка анимаций открытия-закрытия контейнеров).
  • Начальная поддержка Lua-скриптов для расширения возможностей плагиностроения.
  • Поддержка ICU для локализации Lua-скриптов, шейдеров постобработки и элементов интерфейса.
  • Использование дополнительных ядер процессора для фоновых задач (например, для предварительной загрузки локаций для бесшовного перемещения по игровому миру или для обработки коллизий объектов).
  • Отсутствие лимита 4Гб на адресуемую процессом игры память из-за поддержки 64-битных архитектур.
  • Намного меньшее количество вылетов в сравнении с оригинальным движком.
  • Возможность модификации движка под свои нужды (например, довольно популярен TES3MP - форк OpenMW с поддержкой мультиплеера).

OpenMW выпущен под лицензией GPLv3, весь исходный код написан с нуля.

Нужен ли оригинальный Morrowind для OpenMW?

И да, и нет.

ДА. Прежде чем использовать OpenMW, вы должны легально приобрести и установить Morrowind на ваш компьютер. OpenMW воcпроизводит только техническую сторону игры, и не содержит в себе каких-то материалов, защищенных авторским правом. Используются только данные уже установленной игры, либо с установочных файлов с диска или цифровой копии игры.

НЕТ. OpenMW - самостоятельный игровой движок. Он может быть базой для тотальных конверсий, не использующих файлы Morrowind. В качестве примеров можно привести Robowind Construct и StarWind.

Каково текущее состояние проекта?

Статус

OpenMW уже находится в состоянии "бета": основные функции реализованы, идет работа по оптимизации и паритету с MGE и MWSE. Кроме этого есть ряд проблем, в основном с физикой и поддержкой модов, использующих баги и недокументированные возможности оригинального движка.
OpenMW играбелен (можно нормально пройти сюжет игры и аддонов, ветки гильдий и т.д.), хотя и местами уступает MGE в качестве графики, но выигрывает по стабильности, а на многих машинах и по производительности и скорости загрузки локаций.

Какие технологии вы используете?

OpenMW построен с использованием различных библиотек и инструментов с открытым исходным кодом:

  • Языки программирования: C++ (стандарт C++17 с частичной поддержкой C++20), GLSL, Lua
  • Графика: OpenSceneGraph
  • Физика: Bullet
  • Звук: OpenAL
  • Ввод-вывод: SDL2
  • Интерфейс: MyGUI
  • Поиск пути для ИИ: Recast & Detour

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

 

1. Можно просто играть и отсылать багрепорты

2. Можно тестировать разрабатываемый код, до того, как он попадёт в основную ветку. Там же можно вести обсуждение и предлагать изменения.

3. Можно тестировать моды. Основная цель - выявить проблемы с совместимостью.

4. Можно исследовать механики оригинального движка, особенно актуально в области тонкостей работы скриптов.

5. Можно обновлять Wiki.

6. PR тоже не помешает, особенно если он позволит привлечь тестировщиков и плагиностроителей.

7. Можно донатить разработчикам на Patreon'е:

  • psi29 — проджект лид, поможете закрыть траты на хостинг
  • Capostrophic — тысяча и один фикс + вагон фич
  • AnyOldName3 — тени в OpenMW
  • David Cernat — работа над TES3MP
Изменено пользователем akortunov
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

UnPinned posts

Да, спасибо за помощь. Похоже, дело было в порядке загрузки .esm в openmw.cfg.

Т.к. проверил сначала отключением других плагинов - те же проблемы, как на первом скрине двумя постами выше, но изменяя ручками порядок всё заработало. Ух...

Переместил всё сюда.

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

Сейчас проверил. В 0.43 - быстрые атаки от первого лица если и дают смещение, то минимальное. В 0.44 - то же самое, но смещение отчетливо видно.

Дополню: с анимацией ног при атаке что-то не так (0.44), потому смещение значительнее, чем раньше.

В 0.43 анимация проигрывается нормально.

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

У стрекоз в беседкиных звуках горького берега на кейфреймконтроллерах в качестве режима циклирования стоит Clamp, а не Cycle, поэтому OpenMW доблестно проигрывает анимацию стрекоз один раз и стрекозы замирают на месте. Проблема в том, что Morrowind так не делает. В нём стрекозы летают без конца, как должно быть. Если поправить флаг, они одинаково хорошо летают и в опенмв, и в мурокрыле.

Так вот: как на самом деле должны работать флаги, когда дело касается анимаций? Я почитал тут всякие треды, и осознал, что как-то этот режим всё-таки важен, раз уж анимации могут сломаться, если его неправильным сделать.

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

У стрекоз в беседкиных звуках горького берега на кейфреймконтроллерах в качестве режима циклирования стоит Clamp, а не Cycle, поэтому OpenMW доблестно проигрывает анимацию стрекоз один раз и стрекозы замирают на месте. Проблема в том, что Morrowind так не делает. В нём стрекозы летают без конца, как должно быть.

ИЧСХ, у меня у этих стрекоз анимация тоже проигрывалась один раз в Морровинде. Ставил я этот мод несколько лет назад.

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

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

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

Ага. Модель там не модифицированная.

 

Правка: по той же причине плохо летают мотыльки (модифицированные стрекозы) в Nocturnal Moths и светлячки в Fireflies Invade Morrowind (у меня, по крайней мере).

Правка 2: раз уж такая тема, ещё бы неплоха была бы инфа по поводу того, что же именно мурокрыл возвращает в качестве скорости ветра при вызове GetWindSpeed.

Правка 3: доблестно скинул задачу даже хуже разбирающемуся в этом человеку и он умудрился Хрнчамда об этом спросить. Оказывается, это длина "вектора" из одной координаты, который по своему строится для каждой погоды. Много вычислений для относительно бесполезной функции.

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

Можно ли будет использовать MWSE2 скрипты в OpenMW, когда там добавят поддержку Lua? 

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

Пока желающих реализовать все это хозяйство не нашлось.

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

С 31 июля.

Андрей:

  • Иконки лаунчера переработаны: сохранены с правильным профилем и дополнены до полного набора, чтобы они не были произвольными в зависимости от системы и темы системы (которая может быть, например, монохромной).
  • Когда NPC путешествует с AiTravel, он остановится поблизости цели, если на позиции его цели стоит другой NPC.
  • Если ближайший узел сетки путей находится в противоположном направлении от цели, он игнорируется.
  • Предыдущие две вещи исправляют поведение в двух трибунальских квестах
  • Сложность ограничена снизу -500 и сверху +500, чтобы предотвратить переполнение.
  • Если интерфейс увеличен через настройку scaling factor, кукла персонажа будет рендериться в большем разрешении, чтобы не быть размытой на больших экранах. Если он уменьшен, её разрешение не изменится.

я:

  • Привязанные к кастеру эффекты теперь нельзя на себя скастовать - TESCS заклинания с такими эффектами "на себя" не разрешает создавать, а OpenMW-CS разрешает, что ведёт к непредсказуемому поведению. Хотя я мог что-нибудь сломать.
  • Теперь можно делать криты неудачливым жертвам, которые не заметили игрока и не находятся в бою, стрелами, болтами и всякими дротиками. Множитель 4x, как у оружия ближнего боя (зависит от fCombatCriticalStrikeMult).
Ссылка на комментарий
Поделиться на другие сайты

Колдую с увеличением арбалетов и заметил, что тайминги анимаций самих арбалетов сдвинуты в OpenMW относительно Моррки.

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

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

Колдую с увеличением арбалетов и заметил, что тайминги анимаций самих арбалетов сдвинуты в OpenMW относительно Моррки.

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

Про сдвинутые тайминги не понял, но не особо удивлен.

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

Но интересно, игнорирование наклона персонажа - это все-таки только для перезарядки арбалета специфично, или еще где используется? И почему это вообще так?

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

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

Про сдвинутые тайминги не понял, но не особо удивлен.

Анимации арбалета опаздывают (вроде бы). Я увеличил арбалет и чтоб при перезарядке он не входил в землю, я сделал, чтоб он сдвигался назад в данном этапе. В Моррке нормально, а вот в OpenMW это происходит в ином этапе.

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

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

Поддержкой анимации в OpenMW занимался kcat, можно поинтересоваться у него.

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

Поддержкой анимации в OpenMW занимался kcat, можно поинтересоваться у него.

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

 

Анимации арбалета опаздывают (вроде бы). Я увеличил арбалет и чтоб при перезарядке он не входил в землю, я сделал, чтоб он сдвигался назад в данном этапе. В Моррке нормально, а вот в OpenMW это происходит в ином этапе.

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

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

Каюсь. Проверял на 0.43. В 0.44 тайминги у арбалетов вроде нормально работают, а вот анимация бипеда по прежнему так же.

 

 

Я могу посоветовать только багрепорт создать

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

А вообще для зарядки арбалета две анимации, одна на ходу, другая соответственно стоя, а OpenMW использует только стоячую анимацию.

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

Строго говоря, согласно трекеру, если не включать штуки редактора и баги, и включать вещи, на которые рука zini повесила тег "решить до 1.0", это

  • шейдерная рябь на воде от движения живности
  • флаги NiBillboardNode
  • инструкция RepairedOnMe
  • возможность столкновения магических снарядов друг с другом
  • какой-то метод отображать инфу о серьёзных ошибках в самой игре
  • что-то, что позволит яркость корректировать, не обращаясь к багнутой, но работающей совершенно корректно, функции SDL
  • значения по умолчанию для каких-либо из настроек, которые импортируются из Morrowind.ini в openmw.cfg (Zini вообще считает, что это ерунда, которой и некодер может заняться, но что-то смельчака не нашлось)
  • Shift-двойной клик для разворачивания окна на весь экран и обратно, с сохранением состояния
  • нахождение пути улучшить и как-то NiAvoidNode при этом заюзать
  • сделать ИИ для дверей менее отмороженным
  • какой-то способ определять кодировку файлов морровинда автоматически

И... всё. Больше никакие фичи движка тега 1.0 не имеют. Из тех, что не имеют, но они в основном либо у редактора, либо отложены на пост-1.0, могу выделить

  • добавление обработки времени действия магического эффекта EXTRA SPELL :trololo:
  • поддержка вызовов к soundgen у активаторов с моделями существ
  • менее отмороженный прицел при запуске снарядов в движущиеся цели
  • менее отмороженное управление через контроллер и настройки этого самого управления
  • возможность отключить контроллер
  • не давать бродящему ИИ при пропуске времени попадать на узлы сетки путей, которые за закрытыми дверями находятся (но это скорее "баг")
  • возможность в лаунчере скопировать путь к моду через контекстное меню
  • возможность управлять архивами и папками данных через лаунчер
  • время каждой строки в логе
  • квадратическая и TBC-интерполяция у анимаций (сейчас тупо линейная на каждый чих, Greatness7 меня приметил в дискорде и пожаловался)
  • создание источников света внутримодельных (NiDirectionalLight, NiSpotLight и т.д.), а то они читаются, но ничего с ними не делается
  • ну и всякая мелкая спорная хрень по мелочи, больше пост-одиннольная
Ссылка на комментарий
Поделиться на другие сайты

А вообще для зарядки арбалета две анимации, одна на ходу, другая соответственно стоя, а OpenMW использует только стоячую анимацию.

А для кого я распинался выше, когда расписывал, как анимации перезарядки арбалетов работают?

Анимация одна, она же "shoot follow".

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

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

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

 

А чего вообще не хватает до релиза 1.0? Кроме багофикса и OpenMW-CS.

Capostrophic тут напустил туману.

Если вкратце:

1. Надо таки доделать тени.

2. Довести до ума навмеши, что позволит закрыть львиную долю претензий к ИИ.

3. Довести до ума боевые анимации.

4. Реализовать несколько мелких фич (перезаряжать магические предметы вне инвентаря героя, позволить ряду консольных команд менять базовые записи и т.д.)

5. Довести до ума физику.

6. Решить ряд проблем с производительностью.

7. Долго и нудно ловить мелкие баги в модах, т.к. в 1.0 заявлена совместимость с ванильными модами.

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

 

Скорее всего, п.п. 1-4 примерно к 0.46 закроют, п.п. 5-6 у нас пока особо реализовать некому, п. 7 будет реализоваться параллельно остальным.

Редактор я не учитываю, т.к. Zini уже говорил, что если движок будет готов, а редактор - нет, то 1.0 будет без редактора.

 

А вообще, если глянуть в ретроспективе, версия 0.43 была про distant terrain, ИИ и интерфейс, 0.44 больше про совместимость с модами, а в 0.45 много фиксов анимаций.

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

А для кого я распинался выше, когда расписывал, как анимации перезарядки арбалетов работают?

Анимация одна, она же "shoot follow".

Но я смотрел и анимация на ходу и анимация стоя отличаются не только ниже пояса. Или мне показалось.

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

Выглядит вполне выполнимо!

Надеюсь, что хоть в 2019 дождемся релиза 1.0.

 

5. Довести до ума физику.

 

А что с ней не так?

 

7. Долго и нудно ловить мелкие баги в модах, т.к. в 1.0 заявлена совместимость с ванильными модами.

 

Кстати о багах, спешу заявить, что плагин "Корабль 'Оседлавший Бурю'" в OpenMW не работает. Ни лодка, ни корабль не активируются для плавания.

Вот скрипт лодки:

;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Stormrider Boat Script - Copyright © Nov 2004 by Kellick Stormcrow
; Based on: Boat Script - Copyright © Dec 2002 by (MAD)MAX YUE
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
Begin KS_SR_Boat_Script
 
;SCRIPT DEPENDENCIES
;KS_SR_Boat_Create
;KS_SR_Boat_Create_Detect
;KS_SR_Boat_Create_Detect_R
;KS_SR_Boat_Multiplier
;KS_SR_Boat_Multiplier_02
;KS_SR_Boat_Multiplier_03
;KS_SR_Boat_FTravel_GM
;KS_SR_Boat_FTravel_SN
;KS_SR_Boat_FTravel_TB
;KS_SR_Boat_FTravel_SM
;KS_SR_Boat_FTravel_DF
;KS_SR_Boat_FTravel_KH
;KS_SR_Boat_FTravel_Ship
 
;ITEM DEPENDENCIES
;activator KS_SR_Boat (script attaches to)
;misc KS_SR_misc_ship_repair
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
;GLOBAL PARMATERS
;===============================================================================
;float KS_SR_Boat_Angle ; store object Angle before it gets deleted
;short KS_SR_Boat_Auto ; 0=manual turning, 1=auto turn
;short KS_SR_Boat_Cellchange ; flag when player change cell
;short KS_SR_Boat_Damage ; Boat hull rating
;float KS_SR_Boat_Distance ;
;short KS_SR_Boat_Exist ;
;short KS_SR_Boat_Gear ;
;short KS_SR_Boat_Hitflag ;
;short KS_SR_Boat_Sailmode ; 0=dismounted, 1=sailing
;short KS_SR_Boat_Speed ; Sailing speed
;float KS_SR_Boat_X ; Boat x coord
;float KS_SR_Boat_Xdistance ;
;float KS_SR_Boat_Xmul ; pre-determined sin/cos multiplier
;float KS_SR_Boat_Y ; Boat y coord
;float KS_SR_Boat_Ymul ; pre-determined sin/cos multiplier
;float KS_SR_Boat_Ydistance ;
;float KS_SR_Ship_Angle ; Ship Angle
;short KS_SR_Ship_Exist ; Ship exist and boat docking state
;float KS_SR_Ship_X ; Ship x coord
;float KS_SR_Ship_Y ; Ship y coord
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
;LOCAL PARAMETERS
;===============================================================================
float xx ; object x coordinates
float yy ; object y coordinates
float zz ; object z coordinates
float oangle ; object z axis angle
float zangle ; player z axis angle
float xxx ; player x coordinates
float yyy ; player y coordinates
float zzz ; player z coordinates
float xxxx ; boat x coordinate when land on shore
float yyyy ; boat y coordinate when land on shore
short landed ; parameter set when player landed
float stimer ; timer used to delay delete object
short sscript ; parameter set when cell change
short doOnce ; parameter used to set boat position once immediately after creation
short select ; button used for selecting options
short selectflag1 ; flag set when boat is activated
short selectflag2 ; flag set when FTS or Fast Travel is selected
short delay ; parameter used to delay Disable/Enable
short temp ; temporary parameter
short flag
short pressed ; flag to chk SNEAK button pressed and released
float xdist ; parameter used to calculate x distance
float ydist ; parameter used to calculate y distance
float distance ; parameter used to calculate avg distance
short startflag ; parameter used to chk whether boat is docking
short disableflag ; flag used to disable ship script
short repair ; parameter used to calculate repair pts
 
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; SCRIPT BEGINS
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( MenuMode == 1 )
return
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Delete object
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( disableflag == 1 )
Disable
if ( CellChanged == 1 )
SetDelete, 1
endif
return
endif
 
if ( KS_SR_Boat_Speed > 0 )
if ( CellChanged == 1 )
set KS_SR_Boat_Cellchange to 1
endif
endif
 
if ( KS_SR_Ship_Exist == 4 )
set disableflag to 1
set KS_SR_Ship_Exist to 5
return
endif
 
if ( KS_SR_Ship_Exist == 2 )
set KS_SR_Boat_Speed to 0
set KS_SR_Boat_Sailmode to 0
Stopscript KS_SR_Boat_Multiplier
set KS_SR_Ship_Exist to 3
endif
 
if ( KS_SR_Ship_Exist >= 2 )
if ( KS_SR_Ship_Exist != 10 )
return
endif
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Object will warp or remain in previous cell during cell change. To replace the object, 
; a new object is created. Requires global script "KS_SR_Boat_Create" to create new object.
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( KS_SR_Boat_Sailmode == 1 )
if ( KS_SR_Boat_Cellchange == 1 )
startscript, "KS_SR_Boat_Create"
set KS_SR_Boat_Cellchange to 2
set stimer to 0
if ( sscript > 0 )
SetDelete,  1
return
endif
set sscript to 1
endif
endif
 
if ( sscript == 1 )
if ( KS_SR_Boat_Cellchange == 0 )
Disable
set sscript to 2
endif
endif
 
if ( sscript == 2 )
set stimer to ( stimer + GetSecondsPassed )
if ( stimer >= 1.5 )
SetDelete, 1
return
else
return
endif
endif
 
if ( KS_SR_Boat_Speed > 0 )
if ( delay == 0 )
Disable
set delay to 1
endif
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Set boat initial coordinates
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( doOnce == 0 )
Disable
if ( KS_SR_Boat_X != 0 )
if ( KS_SR_Boat_Y != 0 )
set xx to KS_SR_Boat_X
set yy to KS_SR_Boat_Y
if ( KS_SR_Boat_Angle >= 0 )
set oangle to ( KS_SR_Boat_Angle - 180 )
else
set oangle to ( 180 + KS_SR_Boat_Angle )
endif
setpos, x, xx
setpos, y, yy
setpos, z, 2
setAngle, z, oangle
endif
endif
Enable
set doOnce to 1
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Set coordinates correct boat coordinates immediately after load game
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( KS_SR_Boat_Sailmode == 0 )
set xx to KS_SR_Boat_X
set yy to KS_SR_Boat_Y
if ( KS_SR_Boat_Angle >= 0 )
set oangle to ( KS_SR_Boat_Angle - 180 )
else
set oangle to ( 180 + KS_SR_Boat_Angle )
endif
setpos, x, xx
setpos, y, yy
setpos, z, 2
setAngle, z, oangle
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Select Menu Routine
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( selectflag1 == 1 )
set select to GetButtonPressed
if ( select == 0 )
stopscript KS_SR_Boat_Multiplier
startscript KS_SR_Boat_Multiplier_03
set KS_SR_Boat_Sailmode to 0
messagebox "БЫСТРОЕ ПУТЕШЕСТВИЕ", "Назад к кораблю", "Дагон Фел", "Гнаар Мок", "Хла Оуд", "Хуул", "Садрит Мора", "Сейда Нин", "Тель Бранора", "ВЫЙТИ"
set selectflag2 to 1
set selectflag1 to 0
elseif ( select == 1 )
startscript KS_SR_Boat_Create_Detect_R
messagebox "Лодка: Самый малый назад!"
set KS_SR_Boat_Speed to -1
set selectflag1 to 0
elseif ( select == 2 )
messagebox "Лодка надежно стоит на якоре..."
set KS_SR_Boat_Speed to 0
set landed to 2
set selectflag1 to 0
elseif ( select == 3 )
if ( KS_SR_Boat_Damage == 100 )
Messagebox "Повреждений нет!"
elseif ( player->GetItemCount, "KS_SR_misc_ship_repair" > 0 )
playsound "Repair"
player->removeitem "KS_SR_misc_ship_repair", 1
set repair to Random, 100
set KS_SR_Boat_Damage to ( KS_SR_Boat_Damage + repair )
if ( KS_SR_Boat_Damage > 100 )
set KS_SR_Boat_Damage to 100
endif
messagebox "Состояние лодки = %.0f / 100", KS_SR_Boat_Damage
else
messagebox "У вас нет инструментов для ремонта лодки..."
endif
set selectflag1 to 0
elseif ( select == 4 )
if ( KS_SR_Boat_Auto == 0 )
set KS_SR_Boat_Auto to 1
messagebox "Автоматическое управление"
elseif ( KS_SR_Boat_Auto == 1 )
set KS_SR_Boat_Auto to 0
messagebox "Ручное управление"
endif
set selectflag1 to 0
set KS_SR_Boat_Speed to temp
elseif ( select == 5 )
set selectflag1 to 0
set KS_SR_Boat_Speed to temp
endif
return
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; FAST TRAVEL ROUTINE
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( selectflag2 == 1 )
set select to GetButtonPressed
if ( select == 0 )
if ( KS_SR_Ship_Exist == 0 )
messagebox "У вас нет корабля!"
set selectflag2 to 0
set KS_SR_Boat_Speed to temp
set KS_SR_Boat_Sailmode to 1
else
fadeto 100, 0.001
set KS_SR_Boat_X to ( KS_SR_Ship_X + ( 450 * KS_SR_Boat_Xmul ) )
set KS_SR_Boat_Y to ( KS_SR_Ship_Y + ( 450 * KS_SR_Boat_Ymul ) )
set KS_SR_Boat_Angle to KS_SR_Ship_Angle
startscript KS_SR_Boat_FTravel_Ship
set selectflag2 to 2
set disableflag to 1
endif
elseif ( select == 1 )
fadeto 100, 0.001
set KS_SR_Boat_X to 61554
set KS_SR_Boat_Y to 186452
set KS_SR_Boat_Angle to 180
startscript KS_SR_Boat_FTravel_DF
set selectflag2 to 2
set disableflag to 1
elseif ( select == 2 )
fadeto 100, 0.001
set KS_SR_Boat_X to -64276
set KS_SR_Boat_Y to 25636
set KS_SR_Boat_Angle to 60
startscript KS_SR_Boat_FTravel_GM
set selectflag2 to 2
set disableflag to 1
elseif ( select == 3 )
fadeto 100, 0.001
set KS_SR_Boat_X to -48854
set KS_SR_Boat_Y to -38646
set KS_SR_Boat_Angle to 0
startscript KS_SR_Boat_FTravel_HO
set selectflag2 to 2
set disableflag to 1
elseif ( select == 4 )
fadeto 100, 0.001
set KS_SR_Boat_X to -71650
set KS_SR_Boat_Y to 139486
set KS_SR_Boat_Angle to 90
startscript KS_SR_Boat_FTravel_KH
set selectflag2 to 2
set disableflag to 1
elseif ( select == 5 )
fadeto 100, 0.001
set KS_SR_Boat_X to 139792
set KS_SR_Boat_Y to 40697
set KS_SR_Boat_Angle to 90
startscript KS_SR_Boat_FTravel_SM
set selectflag2 to 2
set disableflag to 1
elseif ( select == 6 )
fadeto 100, 0.001
set KS_SR_Boat_X to -8372
set KS_SR_Boat_Y to -72160
set KS_SR_Boat_Angle to 270
startscript KS_SR_Boat_FTravel_SN
set selectflag2 to 2
set disableflag to 1
elseif ( select == 7 )
fadeto 100, 0.001
set KS_SR_Boat_X to 120319
set KS_SR_Boat_Y to -100934
set KS_SR_Boat_Angle to 180
startscript KS_SR_Boat_FTravel_TB
set selectflag2 to 2
set disableflag to 1
elseif ( select == 8 )
set KS_SR_Boat_Speed to temp
set selectflag2 to 0
set KS_SR_Boat_Sailmode to 1
endif
if ( select >= 0 )
startscript KS_SR_Boat_Multiplier
endif
return
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Activate sailing
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( OnActivate = 1 )
if ( KS_SR_Boat_Sailmode == 0 )
StopScript "TribunalMain"
DisablePlayerJumping
player->DisableTeleporting
player->DisableLevitation
set xx to getPos, x
set yy to getPos, y
player->setPos, x, xx
player->setPos, y, yy
player->setPos, z, 0
player->AddSpell "KS_SR_floatboat" ; this spell ( ability ) keeps player fm falling down
set KS_SR_Boat_Speed to 0
set KS_SR_Boat_Sailmode to 1
messagebox "Убедитесь, что включен режим БЕГА!"
startscript KS_SR_Boat_Multiplier
startscript KS_SR_Boat_Create_Detect
if ( KS_SR_Ship_Exist == 10 )
set KS_SR_Ship_Exist to 1
endif
elseif ( KS_SR_Boat_Sailmode == 1 )
messagebox "НАВИГАЦИЯ"
endif
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Gather object and player coordinates
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( KS_SR_Boat_Sailmode > 0 )
set xx to getPos, x
set yy to getPos, y
if ( xx != KS_SR_Boat_X )
set xx to KS_SR_Boat_X
endif
if ( yy != KS_SR_Boat_Y )
set yy to KS_SR_Boat_Y
endif
set xxx to "player"->getPos, x
set yyy to "player"->getPos, y
set zzz to "player"->getPos, z
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Collision Detection Check
-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( KS_SR_Boat_Sailmode == 1 )
set KS_SR_Boat_Xdistance to ( xxx - xx )
set KS_SR_Boat_Ydistance to ( yyy - yy )
set xdist to ( KS_SR_Boat_Xdistance * KS_SR_Boat_Xdistance )
set ydist to ( KS_SR_Boat_Ydistance * KS_SR_Boat_Ydistance )
set distance to ( xdist + ydist )
set KS_SR_Boat_Distance to GetSquareRoot, distance
endif
 
if ( KS_SR_Boat_Speed > 0 )
if ( GetPCRunning == 0 )
if ( KS_SR_Boat_Distance > 30 )
set KS_SR_Boat_Hitflag to 3
set flag to 1
playsound "Pack"
messagebox "По-берегитесь! Ваша лодка УДАРИЛАСЬ обо что-то твердое..."
endif
;messagebox "%.2f", distance
endif
endif
 
if ( KS_SR_Boat_Hitflag == 3 )
if ( KS_SR_Boat_Speed > 0 )
set KS_SR_Boat_Damage to ( KS_SR_Boat_Damage - KS_SR_Boat_Speed )
messagebox "Повреждения = %.0f, Состояние лодки = %.0f / 100", KS_SR_Boat_Speed , KS_SR_Boat_Damage
endif
if ( KS_SR_Boat_Damage <= 0 )
Disable
messagebox "Ваша лодка потерпела КРУШЕНИЕ!"
set KS_SR_Boat_Speed to 0
set KS_SR_Boat_Hitflag to 0
playsound, "KS_SR_Boat_Wreck"
set KS_SR_Boat_Exist to 0
EnablePlayerJumping
player->EnableTeleporting
player->EnableLevitation
set KS_SR_Boat_Sailmode to 0
player->RemoveSpell "KS_SR_floatboat"
StartScript "TribunalMain"
SetDelete, 1
return
endif
if ( flag == 0 )
if ( KS_SR_Boat_Speed > 0 )
set xxxx to ( xx - ( KS_SR_Boat_Xmul * 40 ) )
set yyyy to ( yy - ( KS_SR_Boat_Ymul * 40 ) )
else
set xxxx to ( xx + ( KS_SR_Boat_Xmul * 10 ) )
set yyyy to ( yy + ( KS_SR_Boat_Ymul * 10 ) )
endif
else
set xxxx to ( xx - ( KS_SR_Boat_Xmul * 200 ) )
set yyyy to ( yy - ( KS_SR_Boat_Ymul * 200 ) )
endif
set xx to xxxx
set yy to yyyy
set KS_SR_Boat_Speed to 0
set KS_SR_Boat_Hitflag to 0
set flag to 0
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Restore all parameters after landing
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( landed > 0 )
set KS_SR_Boat_Speed to 0
Stopscript KS_SR_Boat_Multiplier
Disable
set landed to 0
set KS_SR_Boat_X to getPos, x
set KS_SR_Boat_Y to getPos, y
EnablePlayerJumping
player->EnableTeleporting
player->EnableLevitation
player->RemoveSpell "KS_SR_floatboat"
setPos, z, 2
Enable
set KS_SR_Boat_Sailmode to 0
StartScript "TribunalMain"
return
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Speed Control
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( KS_SR_Boat_Sailmode == 1 )
if ( GetPCRunning == 1 )
if ( ScriptRunning, "KS_SR_Boat_Multiplier_02" == 0 )
startscript "KS_SR_Boat_Multiplier_02"
endif
endif
endif
 
if ( KS_SR_Boat_Sailmode == 1 )
if ( GetPCRunning == 1 )
if ( KS_SR_Boat_Gear == 1 )
if ( KS_SR_Boat_Speed < 10 ) ; max speed can be adjusted here ( default = 10 )
set KS_SR_Boat_Speed to ( KS_SR_Boat_Speed + 1 )
if ( KS_SR_Boat_Speed > 10 )
set KS_SR_Boat_Speed to 10
endif
messagebox "Скорость лодки : %.0f", KS_SR_Boat_Speed
else
messagebox "Скорость лодки : %.0f (предельная )", KS_SR_Boat_Speed
endif
elseif ( KS_SR_Boat_Gear == 2 )
if ( KS_SR_Boat_Auto == 0 )
if ( KS_SR_Boat_Speed != 0 )
rotate, z, -60
set oangle to getAngle, z
if ( oangle >= 0 )
set KS_SR_Boat_Angle to ( oangle - 180 )
else
set KS_SR_Boat_Angle to ( 180 + oangle )
endif
endif
endif
elseif ( KS_SR_Boat_Gear == 3 )
if ( KS_SR_Boat_Auto == 0 )
if ( KS_SR_Boat_Speed != 0 )
rotate, z, 60
set oangle to getAngle, z
if ( oangle >= 0 )
set KS_SR_Boat_Angle to ( oangle - 180 )
else
set KS_SR_Boat_Angle to ( 180 + oangle )
endif
endif
endif
elseif ( KS_SR_Boat_Gear == 4 )
if ( KS_SR_Boat_Speed > 0 ) ; min speed can be adjusted here ( default = 0 )
set KS_SR_Boat_Speed to ( KS_SR_Boat_Speed - 1 )
messagebox "Скорость лодки : %.0f", KS_SR_Boat_Speed
else
set KS_SR_Boat_Speed to 0
messagebox "Скорость лодки : 0 ( остановлена )"
endif
endif
else
stopscript "KS_SR_Boat_Multiplier_02"
endif
endif
 
if ( KS_SR_Boat_Sailmode == 1 )
if ( pressed == 0 )
if ( GetPCSneaking == 1 )
set pressed to 1
endif
else
if ( GetPCSneaking == 0 )
set pressed to 0
messagebox "ОПЦИИ" "Быстрое путешествие" "Задний ход" "Бросить якорь" "Чинить лодку" "Авто/ручной режим" "ВЫЙТИ"
Enable
set selectflag1 to 1
set temp to KS_SR_Boat_Speed
set KS_SR_Boat_Speed to 0
return
endif
endif
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Sail direction calculation by using player zrot angle - resolution 1 degree
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( KS_SR_Boat_Sailmode > 0 )
set xx to ( xx + ( KS_SR_Boat_Xmul * KS_SR_Boat_Speed ) )
set yy to ( yy + ( KS_SR_Boat_Ymul * KS_SR_Boat_Speed ) )
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Set the sailing motion
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
if ( KS_SR_Boat_Sailmode > 0 )
player->setPos, x, xx
player->setPos, y, yy
player->setPos, z, 2
setPos, x, xx
setPos, y, yy
setPos, z, 2
set KS_SR_Boat_X to xx
set KS_SR_Boat_Y to yy
if ( KS_SR_Boat_Auto == 1 )
if ( KS_SR_Boat_Speed > 0 )
set KS_SR_Boat_Angle to "player"->getAngle, z
if ( KS_SR_Boat_Angle >= 0 )
set oangle to ( KS_SR_Boat_Angle - 180 )
else
set oangle to ( 180 + KS_SR_Boat_Angle )
endif
setAngle, z, oangle
endif
endif
endif
 
if ( delay == 1 )
Enable
set delay to 0
endif
 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; SCRIPT ENDS
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
End KS_SR_Boat_Script

Если найдется время, буду благодарен за помощь.

 

 

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

Надеюсь, что хоть в 2019 дождемся релиза 1.0.

Сглазишь.

 

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

 

Правка: если там тот же скрипт, что и в версии на нексусе, то он не компилится из-за того, что ряд дефисов где-то около 388 строки не закомментирован

Правка 2: да, вот это место

 
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
; Collision Detection Check
-------------------------------------------------------------------------------------------------------------------------------------------------------------
 
закомментировать третью строку и скорее всего дело пойдёт нормально
 
правка 3: не компилится скрипт ks_sr_ini, потому что он глобальный, но какая-то из функций не работает без вызывающего объекта
правка 4: это getitemcount. похоже, скрипт пытается добавить предмет в том случае, если он не существует. но getitemcount должен работать только на предметах в инвентаре...
 
Если заспаунить торговца и телепортатор вручную и купить у торговца лодку, лодка вполне себе заведётся. Классно работает, кстати.
правка 5: вердикт
скрипты поломаны нахрен и работают в оригинале только потому, что ваниль не может в обработку ошибок, фикса не будет (исправить можно сами скрипты), мод классный
Изменено пользователем Capostrophic
Ссылка на комментарий
Поделиться на другие сайты

Насколько я помню, в StormRider'е проблема как раз с физикой - телепортационные команды в Морровинде задействуют физику для обнаружения коллизий (мы не знаем, как именно), а OpenMW честно перемещает объект в заданную позицию.

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

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

Спасибо за помощь! Плагин заработал, но с некоторыми нюансами, отличными от ванили. Потестил только на лодке.

 

1) Коллизии со статиками не работают, как и заметил akortunov. Причем с террейном всё сталкивается нормально.

2) В ручном режиме плавания при повороте на определенное кол-во градусов (540 направо от изначального положения лодки, 90 - налево) вектор движения лодки перестает реагировать на повороты. Причем если вырулить обратно - всё приходит в норму.

 

Со скриптом ks_sr_ini проблем не было.

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

такой подход не работает

мне сначала показалось, что это фича :trololo:

 

(540 направо

Вот это может быть проблемой. Углы доводятся до "корректного значения" (от -180 до 180 градусов, от минус пи до пи радианов) только для камеры.

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

В OpenMW сейчас используется osgAnimation или пересели на что-то другое?

Да кто его сейчас разберет. Вроде самопальная какая-то реализация используется, хотя osgAnimation.dll по-прежнему пакуется.

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

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

Вы сможете оставить комментарий после входа в



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

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