====== 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~~