====== TES3MP / OpenMW ====== [[https://github.com/TES3MP/TES3MP|TES3MP]] - многопользовательская реализация игрового движка [[https://github.com/OpenMW/openmw|OpenMW]] для The Elder Scrolls III: Morrowind. Для сетевой игры посредством Yggdrasil создан [[https://github.com/YGGverse/CrabNet/tree/ipv6|патч библиотеки CrabNet]], реализующий поддержку IPv6 **вместо IPv4** а также [[https://github.com/YGGverse/TES3MP-forge/tree/ipv6|форк для автоматической сборки движка в Docker]] (контейнер для запуска игры не требуется). Патч IPv6 является рабочим но прототипом. По причине отсутствия двойного стека, развитие ветки в текущем виде и PR в TES3MP не планируется. Тем не менее, желающие реализовать такую функциональность в официальном движке - могут использовать готовые наработки (учитывая также, что версия TES3MP 0.8.1 требует фундаментального апгрейда до актуальной версии OpenMW 0.51.0, реализующей уже новый API). ===== Установка ===== Сборка аналогична оригиналу, за исключением модифицированных источников CrabNet и обязательной активации CRABNET_SUPPORT_IPV6: git clone https://github.com/YGGverse/TES3MP-forge.git cd TES3MP-forge docker build --tag yggverse/tes3mp-forge --build-arg BUILD_THREADS=4 . docker run --rm -it -v /tmp/TES3MP:/build yggverse/tes3mp-forge Сгенерированный релиз /tmp/TES3MP/*.tar.gz распаковать по назначению. ==== Локальные библиотеки ==== В зависимости от дистрибутива и его предустановок, при запуске игры могут быть ошибки отсутствующих библиотек. Например, сборка оригинального tes3mp-forge на Fedora 44 требует: libavformat.so.58 libavutil.so.56 libswresample.so.3 libvpx.so.5 libwebp.so.6 libcrystalhd.so.3 libaom.so.0 libcodec2.so.0.8.1 libshine.so.3 libx264.so.155 libx265.so.165 libpcre.so.3 libsndio.so.7.0 libavcodec.so.58 libswscale.so.5 libbluray.so.2 libssh-gcrypt.so.4 Извлечь нужные библиотеки можно непосредственно со сборочного контейнера Docker - сначала я делал это скриптом bash (с корня распакованного билда) копируя требуемые файлы в ./lib но вскоре реализовал [[ https://github.com/YGGverse/TES3MP-deploy/commit/b3c5c0f847c855ea16bb8954822b8fd96130f517 | патч TES3MP-deploy]], поэтому скрипт ниже пригодится только если вы собираетесь с оригинальной версии GrimKriegor/TES3MP-forge вместо актуальной YGGverse/TES3MP-forge/ipv6: docker run --rm --entrypoint bash yggverse/tes3mp-forge -c ' files=( libavformat.so.58 libavutil.so.56 libswresample.so.3 libvpx.so.5 libwebp.so.6 libcrystalhd.so.3 libaom.so.0 libcodec2.so.0.8.1 libshine.so.3 libx264.so.155 libx265.so.165 libpcre.so.3 libsndio.so.7.0 libavcodec.so.58 libswscale.so.5 libbluray.so.2 libssh-gcrypt.so.4 ) paths=() for f in "${files[@]}"; do if [ -f "/usr/lib/$f" ]; then paths+=("/usr/lib/$f") elif [ -f "/usr/lib/x86_64-linux-gnu/$f" ]; then paths+=("/usr/lib/x86_64-linux-gnu/$f") elif [ -f "/lib/x86_64-linux-gnu/$f" ]; then paths+=("/lib/x86_64-linux-gnu/$f") fi done tar -chf - "${paths[@]}" 2>/dev/null ' | tar -xf - -C ./lib --strip-components=3 --no-same-permissions ===== Игровые наборы ===== На стороне сервера не требуются. На стороне клиента - устанавливаются посредством менеджера: ./openmw-wizard Для многопользовательской игры TES3MP важно учитывать CRC32 файла Morrowind.esm, которую сервер будет считать валидной: * 0x7B6AF5B9 - Morrowind: Game of the Year Edition (GOTY) / GOG * 0x34282D67 - AkelLa (1С) Администратор сервера может изменить это значение в файле: // This file lets you enforce a certain plugin list and order for all clients // attempting to join this server // // By default, only the English and Russian editions of Morrowind are allowed, // because the German and French editions have hardcoded translations, whereas // the Russian edition has localization files that make it compatible with the // English edition [ {"Morrowind.esm": ["0x7B6AF5B9", "0x34282D67"]}, {"Tribunal.esm": ["0xF481F334", "0x211329EF"]}, {"Bloodmoon.esm": ["0x43DD2132", "0x9EB62F26"]} ] ===== Сервер ===== [General] # На примере сборки IPv6 - указывается конкретный адрес, бинд на :: не работает localAddress = 202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148 port = 25565 maximumPlayers = 64 hostname = TES3MP server # 0 - Verbose (spam), 1 - Info, 2 - Warnings, 3 - Errors, 4 - Only fatal errors logLevel = 1 password = [Plugins] home = ./server plugins = serverCore.lua [MasterServer] enabled = false address = master.tes3mp.com port = 25561 rate = 10000 [Unit] After=network.target Wants=network.target [Service] Type=simple User=tes3mp Group=tes3mp WorkingDirectory=/home/tes3mp/TES3MP Environment="LD_LIBRARY_PATH=./lib" ExecStart=/home/tes3mp/TES3MP/tes3mp-server.x86_64 # mkdir /var/log/tes3mp && chown tes3mp:tes3mp -R /var/log/tes3mp StandardOutput=file:///var/log/tes3mp/debug.log StandardError=file:///var/log/tes3mp/error.log [Install] WantedBy=multi-user.target ===== Клиент ===== Сборка IPv6 не реализует обработку аргументов --connect, мастер сервера и браузер, вместо этого нужно указать конкретный сервер через конфиг: [General] destinationAddress = 202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148 port = 25565 password = # 0 - Verbose (spam), 1 - Info, 2 - Warnings, 3 - Errors, 4 - Only fatal errors logLevel = 0 [Master] address = master.tes3mp.com port = 25561 [Chat] # Use https://wiki.libsdl.org/SDL_Keycode to find the correct key codes when rebinding # # For chatting keySay = Y # For enabling or disabling the chat window keyChatMode = F2 x = 0 y = 0 w = 390 h = 250 # How long the message will be displayed in hidden mode delay = 5.0 Запуск: ./tes3mp ===== Подсказки для новичков ===== * настроить аудио, графику и моды можно посредством ./openmw-launcher * при первом входе указать новый логин/пароль; при последующих - существующий * игровой прогресс - сохраняется автоматически на стороне сервера * для активации игрового чата - нажать "Y" * активация боевого режима - "F" (в этом режиме вход в некоторые локации не доступен) * вызов игрового меню - правой кнопкой мыши * пауза в многопользовательской игре отсутствует ===== Список серверов Yggdrasil ===== * [202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:25565 ([[http://[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:25580 | Веб-страничка ]] с актуальной информацией) ~~DISCUSSION~~