TES3MP - многопользовательская реализация игрового движка OpenMW для The Elder Scrolls III: Morrowind.
Для сетевой игры посредством Yggdrasil создан патч библиотеки CrabNet, реализующий поддержку IPv6 вместо IPv4 а также форк для автоматической сборки движка в 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 но вскоре реализовал патч 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, которую сервер будет считать валидной:
Администратор сервера может изменить это значение в файле:
// 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
