💾 Archived View for betahowto.duckdns.org › yggdrasil:games:half_life_on_xash3d captured on 2024-02-05 at 10:04:13. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
Недавно появился внутрисетевой сервер Half-Life ( /yggdrasil:sites_and_services:other_network_services#half-life ) на базе движка Xash3D FWGS.
Стало интересно разобраться в особенностях IPv6 / Yggdrasil и создать этот материал для тех, кто захочет поднять внутрисетевой сервер с нуля и кастомизировать его в дальнейшем.
Half-Life - всем известный шутер от первого лица, за 20 лет не утративший свою популярность.
Технические требования минимальны, игра работает даже на компьютерах без предустановленных видео-драйверов.
Xash3D FWGS ( https://github.com/FWGS/xash3d-fwgs ) - это мульти-платформенный движок с открытым кодом для запуска файлов игры Half-Life 1, с некоторыми доработками оригинального Xash3D ( https://www.moddb.com/engines/xash3d-engine ).
Файлы самой игры Half-Life нужно приобрести отдельно, затем скопировать в директорию valve с установленным Xash3D FWGS.
Для сборки и запуска необходимо добавить поддержку библиотек архитектуры i386:
dpkg --add-architecture i386 apt update apt install build-essential gcc-multilib g++-multilib python3 libsdl2-dev:i386 libfontconfig-dev:i386 libfreetype6-dev:i386
При возникновении ошибки запуска в последних версиях
Host_InitError: Can't initialize cl_dlls/client.so: vgui.so: cannot open shared object file: No such file or directory
нужно скопировать файл vgui.so уровнем выше директории valve
~/.steam/steam/steamapps/common/Half-Life/
Xash3D FWGS YGGverse Edition ( https://github.com/YGGverse/xash3d-fwgs/branches ) основан на ветке master от Xash3D FWGS, целью проекта является создание сборки, ориентированной на сеть Yggdrasil.
В рамках разработки осуществляются обратно-совместимые контрибуции.
Сборка не отличается от инструкций Xash3D FWGS, достаточно указать адрес репозитория (или использовать нужную ветку для слияния с официальным xash3d-fwgs):
git clone --recursive https://github.com/YGGverse/xash3d-fwgs.git cd xash3d-fwgs git checkout yggdrasil-only ./waf configure -T release ./waf build ./waf install --destdir=/path/to/game
В рамках релизов ( https://github.com/YGGverse/xash3d-fwgs/releases ), публикуются бинарные пакеты для Linux что может быть удобным для начинающих пользователей.
При использовании сборок yggdrasil-only ( https://github.com/YGGverse/xash3d-fwgs/tree/yggdrasil-only ) или yggdrasil-inclusive ( https://github.com/YGGverse/xash3d-fwgs/tree/yggdrasil-inclusive ) от Xash3D FWGS / YGGverse Edition, в списке "интернет игры" будут доступны все доступные внутрисетевые сервера Yggdrasil.
В остальных случаях, клиент будет работать с IPv6, но по-умолчанию ориентирован на сеть IPv4 и мастер сервер от FWGS - mentality.rip:27010
Можно вручную подключиться к заведомо известному узлу Yggdrasil из консоли с помощью тильды:
connect [201:5eb5:f061:678e:7565:6338:c02c:5251]:27015
С недавних пор, удалось портировать патч для xash3d-fwgs ( /#pymaster]] для работы с IPv6, также имеется [[https://github.com/YGGverse/xash3d-fwgs/commit/afec7161842e928a5627d724e4fd7445fb7c3ee6 ), позволяющий принимать IPv6 адреса от мастера.
Чтобы удалить IPv4 сервера из списка, открываем консоль и пишем:
clearmasters
затем добавляем внутрисетевой мастер сервер или несколько по очереди:
addmaster [201:5eb5:f061:678e:7565:6338:c02c:5251]:27010
проверяем
listmasters
Данные настройки сохраняются после перезагрузки в файле /valve/xashcomm.lst, также можно добавить сервера вручную, по одному на строку.
Для удобного запуска клиента, можно добавить его в меню приложений:
~/.local/share/half-life.desktop
[Desktop Entry] Encoding=UTF-8 Name=Half-Life Exec=/path/to/xash3d Comment=Half-Life on Xash3D Terminal=false Icon=/path/to/hl.png Type=Application StartupNotify=false Categories=Games
Затем активировать:
xdg-desktop-menu install ~/.local/share/half-life.desktop
Для разных сборок Xash3D, удобно использовать тематические иконки ( https://github.com/YGGverse/hl-customs ), например для сборки Yggdrasil:
/yggdrasil:half_life_on_xash3d:hl-icon-ipv6.png?128|
/yggdrasil:half_life_on_xash3d:hl-icon-yggdrasil.png?128|
При наличии установленного клиента с файлами игры, запуск сервера в сети Yggdrasil/IPv6 осуществляется командой:
xash3d -dedicated -port6 27015 -ip6 xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx -noip +maxplayers 8 +map crossfire
Дополнительные настройки можно указать в файлах
Чтобы сервер был доступен в списке мастер сервера, важно указать:
server.cfg
sv_lan 0 public 1
Конфигурация:
/etc/systemd/system/half-life-server.service
[Unit] Description=Half-Life Server After=network.target [Service] Type=simple User=halflife ExecStart=/home/halflife/xash3d -dedicated -port6 27015 -ip6 xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx -noip +maxplayers 8 +map crossfire StandardOutput=file:/home/halflife/server-debug.log StandardError=file:/home/halflife/server-error.log Restart=on-failure [Install] WantedBy=multi-user.target
Автозапуск:
systemctl daemon-reload systemctl enable half-life-server systemctl start half-life-server
FastDL - сокр. "быстрая загрузка", способ передачи дополнительных ресурсов игры клиенту сервером.
Обычно, реестр организуется средствами сервера nginx таким образом, чтобы файловая структура соответствовала структуре в директории valve:
/maps /models /sound /materials
В файле server.cfg указывается URL к данным директориям:
server.cfg
sv_downloadurl "http://xx.xx.xx.xx/fastdl/half-life/" sv_allowdownload 1
где /fastdl/half-life/ - путь к структуре файлов на сервере.
Утилита используется для создания файла дополнительных зависимостей в формате .res для загрузки клиентом из сервера при инициализации карты.
Может быть полезна, если требуется отправить клиенту дополнительные модели игроков, при этом не создавая форки локаций.
Есть исходники ( https://github.com/kriswema/resgen ) и рабочая сборка для Linux ( https://github.com/kriswema/resgen/releases ).
Принцип работы
Извлекаем зависимости карты:
Linux.64-bit /valve/maps/crossfire.bsp
В этой же директории будет создан одноименный файл с расширением .res, который можно открыть текстовым редактором и добавить нужную зависимость:
crossfire.res
// crossfire.res - created with RESGen v2.0.3. // RESGen is made by Jeroen "ShadowLord" Bogers, // with serveral improvements and additions by Zero3Cool. // For more info go to http://resgen.hltools.com // .res entries (9): halflife.wad sound/ambience/jetflyby1.wav sound/ambience/siren.wav sound/debris/beamstart11.wav sound/weapons/electro5.wav sound/weapons/mortarhit.wav sound/weapons/sbarrel1.wav sprites/muzzleflash1.spr sprites/steam1.spr models/player/... // добавляем в конец файла логический путь к новому файлу (на примере модели FastDL)
Файл .res должен находится в той же директории что и файл карты - /valve/maps.
Перезагружаем сервер и переподключаем клиент - кастомнный скин должен быть автоматически загружен клиентом и добавлен в директорию /valve/downloaded/models/player/...
Мастер-сервер нужен для удобного поиска игровых серверов через интерфейс игры, иначе нужно каждый раз вводить адрес/порт сервера вручную.
<WRAP round info 60%>
Официальный pymaster считается устаревшим, но силами сообщества в отдельных форках есть активность. Разработчики официальной версии обещают версию на Rust, но дата публикации не известна.
Для работы с Yggdrasil, рекомендуется версия от YGGverse ( https://github.com/YGGverse/pymaster/tree/v2 ), включающая в себя поддержку IPv6 и обновления протокола Xash3D.
</WRAP>
pymaster ( https://github.com/FWGS/pymaster ) - это Python реализация мастер-сервера HLMaster ( https://github.com/ezhangle/hlmaster ), в рамках проекта FWGS.
Для запуска необходимо открыть порт 27010 и выполнить команду:
pymaster.py -i :: -p 27010
Чтобы pymaster начал отдавать игровые сервера клиентам, обе стороны должны быть скомпилированы или настроены на данный мастер-сервер.
В Xash3D исходники находятся в файле engine/common/netchan.h строки MASTERSERVER_ADR или в файле конфигурации /valve/xashcomm.lst
При использовании клиента с графическим интерфейсом, можно динамически указывать мастер сервер в консоли, командами listmasters/clearmasters/addmaster адрес:порт
Обновление типичных конфигураций valve - steamcomm.lst и valvecomm.lst игнорируется при запуске в оболочке Xash3D.
xash3d-master ( https://git.mentality.rip/numas13/xash3d-master ) - недавний релиз мастер сервера для Xash3D, написанного на языке Rust.
Чтобы оживить сервер и сделать ожидание игроков интереснее, в игру можно добавить ботов с помощью сторонних плагинов ( https://github.com/FWGS/xash3d-fwgs/issues/1556#issuecomment-1876014868 ).
Самый простой способ - установка последней версии Bot Number 10 ( http://hpb-bot.bots-united.com/downloads.html ).
Загружаем архив для Linux ( http://hpb-bot.bots-united.com/releases/bot10_linux.tgz ) и распаковываем содержимое в корневую директорию с бинарником xash3d таким образом, чтобы директория bot была рядом с valve.
Поскольку плагин являет собой расширение, он не перезаписывает файлы игры, и запускать сервер необходимо указав новый путь к директории игры:
xash3d -game bot
Важно учитывать, что при запуске из нестандартной директории, сервер будет отфильтрован большинством мастер серверов, в виду фильтрации по valve.
Чтобы решить эту проблему, можно:
Также, чтобы сервер удалял ботов при подключении игроков, важно указать явно минимальное
bot.cfg
min_bots 1 # не ставить в 0, интерпретируется как false max_bots 4
После запуска, настроенные в bot.cfg персонажи будут добавлены в игру. Плагин является частью проекта hlsdk-portable ( https://github.com/FWGS/hlsdk-portable/commits/bot10 ), при возникновении проблем, возможно потребуется собрать файл /valve/dlls/hl.so и заменить им оригинальный, хотя в случае с последней версией Steam - все работает без дополнительных действий.
На сайте есть архив с исходниками ( http://hpb-bot.bots-united.com/releases/bot10src.zip ), но последнюю версию можно собрать из репозитория с файлами SDK:
git clone --recursive https://github.com/FWGS/hlsdk-portable.git git checkout bot10 cmake -B build -S . cmake --build build
После компиляции ветки, будет доступен только файл bot.so - остальные файлы нужно собирать отдельно.
Если для остальных файлов не нужна особая сборка, можно переименовать bot.so в bot_i486.so и смержить с официальным архивом для Linux, пока что это работает.
Открытая модификация Bot Number 10 для сервера YGGverse
1.0.0
сборка
git clone --recursive https://github.com/YGGverse/hlsdk-portable.git git checkout bot10-yggverse cmake -B build -S . cmake --build build
Есть бинарные релизы ( https://github.com/YGGverse/hlsdk-portable/releases ) для более ранних систем.
В сетевой игре можно использовать графити, с помощью кнопки T. Изображение выбирается в настройках клиента, раздел "Multiplayer" - "Customize".
Чтобы создать свой логотип, изображение должно быть размером 64х64 пикселя, в палитре Grayscale и формате .BMP
Ниже рассмотрен пример обработки изображения PNG из коллекции hl-customs ( https://raw.githubusercontent.com/YGGverse/hl-customs/main/icons/ipv6/128x128.png ) в редакторе GIMP:
1. Image → Scale Image → 64x64 / Quanlity: Linear
2. Layer → Transparency → Remove Alpha Channel
3. Colors → Components → Decompose
4. Colors → Invert (черный цвет считается прозрачным)
5. File → Export As.. → сохраняем по адресу /valve/logos/filename.bmp
Результат на данном примере будет иметь следующий вид ( https://raw.githubusercontent.com/YGGverse/hl-customs/main/icons/ipv6/valve/logos/ipv6.bmp )
Следует заметить, что создание Ч/Б графики обусловлено возможностью выбора цвета в интерфейсе игры.
Имеется открытая конфигурация ( https://github.com/YGGverse/half-life-server ) сервера, можно вносить свои предложения или использовать для организации нового сервера.
Xash3D FWGS ( https://github.com/FWGS/xash3d-fwgs ) / YGGverse Edition ( https://github.com/YGGverse/xash3d-fwgs/branches )
Half-Life в Steam ( https://store.steampowered.com/app/70/HalfLife/ )
Параметры конфигурации сервера ( https://www.svencoop.com/manual/server-config.html )
официальный pymaster ( https://github.com/FWGS/pymaster ) | более чистая версия от @xdettlaff ( https://github.com/xdettlaff/pymaster ) | адаптация от YGGverse на базе @xdettlaff ( https://github.com/YGGverse/pymaster/tree/v2 )
xash3d-master на rust ( https://git.mentality.rip/numas13/xash3d-master ) | http://[316:c51a:62a3:8b9::4]/YGGverse/xash3d-master|зеркало Yggdrasil
Информация о мастер-сервере ( https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol:ru )
Серверные запросы с множеством полезных ссылок ( https://developer.valvesoftware.com/wiki/Server_queries )
Боты, совместимые с Xash3D ( http://hpb-bot.bots-united.com/index.html ) | Bot Number 10 by YGGverse ( https://github.com/YGGverse/hlsdk-portable/tree/bot10-yggverse )
Библиотека PHP 8 для веб разработчиков ( https://github.com/YGGverse/hl-php )
Каталог скинов ( https://gamebanana.com/mods/cats/7734 ) | Графити Yggdrasil ( https://raw.githubusercontent.com/YGGverse/hl-customs/main/icons/yggdrasil/valve/logos/yggdrasil.bmp ) | Графити IPv6 ( https://raw.githubusercontent.com/YGGverse/hl-customs/main/icons/ipv6/valve/logos/ipv6.bmp )
https://github.com/FWGS/xash3d-fwgs
https://www.moddb.com/engines/xash3d-engine
https://github.com/YGGverse/xash3d-fwgs/branches
https://github.com/YGGverse/xash3d-fwgs/tree/master
https://github.com/YGGverse/xash3d-fwgs/tree/sv-downloadurl-ipv6
https://github.com/YGGverse/xash3d-fwgs/tree/master-hl-ygg
https://github.com/YGGverse/xash3d-fwgs/tree/yggdrasil-masters
https://github.com/YGGverse/xash3d-fwgs/tree/yggdrasil-only
https://github.com/YGGverse/xash3d-fwgs/tree/yggdrasil-inclusive
https://github.com/YGGverse/xash3d-fwgs.git
https://github.com/YGGverse/xash3d-fwgs/releases
https://github.com/YGGverse/xash3d-fwgs/commit/afec7161842e928a5627d724e4fd7445fb7c3ee6
https://github.com/YGGverse/hl-customs
http://xx.xx.xx.xx/fastdl/half-life/"
https://github.com/FWGS/xash3d-fwgs/issues/1559
https://github.com/kriswema/resgen
https://github.com/kriswema/resgen/releases
https://github.com/YGGverse/pymaster/tree/v2
https://github.com/FWGS/pymaster
https://github.com/ezhangle/hlmaster
https://github.com/FWGS/pymaster/blob/master/etc/systemd/system/pymaster.service
https://git.mentality.rip/numas13/xash3d-master
https://github.com/FWGS/xash3d-fwgs/issues/1556#issuecomment-1876014868
http://hpb-bot.bots-united.com/downloads.html
http://hpb-bot.bots-united.com/releases/bot10_linux.tgz
https://github.com/FWGS/hlsdk-portable/commits/bot10
http://hpb-bot.bots-united.com/releases/bot10src.zip
https://github.com/FWGS/hlsdk-portable.git
https://github.com/YGGverse/hlsdk-portable.git
https://github.com/YGGverse/hlsdk-portable/releases
https://raw.githubusercontent.com/YGGverse/hl-customs/main/icons/ipv6/128x128.png
https://raw.githubusercontent.com/YGGverse/hl-customs/main/icons/ipv6/valve/logos/ipv6.bmp
https://github.com/YGGverse/half-life-server
http://[201:5eb5:f061:678e:7565:6338:c02c:5251]/hl/
https://store.steampowered.com/app/70/HalfLife/
https://www.svencoop.com/manual/server-config.html
https://github.com/xdettlaff/pymaster
http://[316:c51a:62a3:8b9::4]/YGGverse/xash3d-master|зеркало
https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol:ru
https://developer.valvesoftware.com/wiki/Server_queries
http://hpb-bot.bots-united.com/index.html
https://github.com/YGGverse/hlsdk-portable/tree/bot10-yggverse
https://github.com/YGGverse/hl-php
https://gamebanana.com/mods/cats/7734
https://raw.githubusercontent.com/YGGverse/hl-customs/main/icons/yggdrasil/valve/logos/yggdrasil.bmp