Half-Life на базе Xash3D

Недавно появился внутрисетевой сервер Half-Life на базе движка Xash3D FWGS.

Стало интересно разобраться в особенностях IPv6 / Yggdrasil и создать этот материал для тех, кто захочет поднять внутрисетевой сервер с нуля и кастомизировать его в дальнейшем.

Half-Life

Half-Life - всем известный шутер от первого лица, за 20 лет не утративший свою популярность.

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

Xash3D FWGS

Xash3D FWGS - это мульти-платформенный движок с открытым кодом для запуска файлов игры Half-Life 1, с некоторыми доработками оригинального Xash3D.

Файлы самой игры 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

Xash3D FWGS YGGverse Edition основан на ветке master от Xash3D FWGS, целью проекта является создание сборки, ориентированной на сеть Yggdrasil.

В рамках разработки осуществляются обратно-совместимые контрибуции.

Ветки

  • master - зеркало официальной master от Xash3D FWGS для обновлений upstream
  • yggdrasil-only - предусматривает сборку для подключения исключительно к внутрисетевым серверам Yggdrasil
  • multinet - мульти-сетевая ветка (Интернет + Yggdrasil + Mycelium и др.) - оптимальна для игрового сервера, видимого в списке сетевых игр для клиентов yggdrasil-only

Сборка

Сборка не отличается от инструкций 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

ARM

Клиент / сервер могут работать на различных платформах, включая ARM. На примере armv7, необходимо дополнительно собрать зависимости hlsdk-portable:

git clone https://github.com/FWGS/hlsdk-portable.git
cd hlsdk-portable
./waf configure -T release
./waf

После чего скопировать следующие файлы:

  • hlsdk-portable/build/cl_dll/client_armv7hf.so > valve/cl_dlls/client_armv7hf.so
  • hlsdk-portable/build/dlls/hl_armv7hf.so > valve/dlls/hl_armv7hf.so

Потребление ресурсов с одним игроком на процессоре Cortex-A7 и 1GB LPDDR3 SDRAM памяти:

Клиент

При использовании сборок yggdrasil-only или multinet от Xash3D FWGS / YGGverse Edition, в списке «интернет игры» будут по-умолчанию доступны внутрисетевые сервера Yggdrasil (для multinet - Интернет, Yggdrasil, Mycelium и другие).

В остальных случаях, клиент будет работать с IPv6, но по-умолчанию ориентирован на сеть IPv4 и мастер сервер от FWGS - mentality.rip:27010

Можно вручную подключиться к заведомо известному узлу Yggdrasil из консоли с помощью тильды:

connect [300:dee4:d3c0:953b::2019]:27015

С недавних пор, удалось портировать pymaster для работы с IPv6, также имеется патч для xash3d-fwgs, позволяющий принимать IPv6 адреса от мастера.

Чтобы удалить IPv4 сервера из списка, открываем консоль и пишем:

clearmasters

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

addmaster [300:dee4:d3c0:953b::2019]:27010

проверяем

listmasters

Данные настройки сохраняются после перезагрузки в файле /valve/xashcomm.lst, также можно добавить сервера вручную, по одному на строку.

* тильда работает только в режиме игры, вызов консоли также доступен из главного меню при запуске Xash3D с флагом -dev.

Лаунчер

Для удобного запуска клиента, можно добавить его в меню приложений:

~/.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, удобно использовать тематические иконки, например для сборки Yggdrasil:

Сервер

При наличии установленного клиента с файлами игры, запуск сервера в сети Yggdrasil/IPv6 осуществляется командой:

xash3d -dedicated -port6 27015 -ip6 xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx -noip +maxplayers 8 +map crossfire
  • важно указывать канонический адрес узла -ip6 явно (вместо [::]) т.к. при наличии адреса подсети или дополнительной сети вроде Mycelium, возможно автоматическое автоопределение сетевого адреса сокета и как следствие - периодические ошибки подключения клиента и обнаружения в списке мастер сервера; для реализации мульти-сетевой маршрутизации, смотрите:
    • Мульти-сетевой прокси UDP средствами Nginx - важно указать локальный адрес сервера (proxy_pass) как IPv6, чтобы сервер «умел» отправлять запросы на мастер IPv6
      • [::1] - в этом случае, будет произведена отправка статуса на мастера всех сетей (Интернет, Yggdrasil, Mycelium и т.д.) со случайного IPv6 адреса соответствующей сети (или адреса подсети, если такой имеется)
      • [xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx] - отправка статуса на мастер будет произведена с канонического IPv6 текущей сети, но мастера других сетей (Интернет, Mycelium и т.д.) вероятно, будут игнорироваться
  • -noip отключает режим IPv4, если у сервера есть «белый IP» - можно разрешить подключение игроков из Clearnet: -ip xx.xx.xx.xx
  • не забываем открыть порт 27015 (указать можно любой, но клиенты будут вынуждены указывать вместо «connect host» нестандартный порт «connect host:port»)

Дополнительные настройки можно указать в файлах

  • /valve/server.cfg - базовые настройки, такие как имя сервера (hostname)
  • /valve/skill.cfg - спецификация сервера
  • /valve/listip.cfg - настройки ограничения доступа
  • /valve/banned.cfg

Чтобы сервер был доступен в списке мастер сервера, важно указать:

server.cfg
sv_lan 0
public 1

* стандартный мастер сервер mentality.rip фильтрует по -game valve

systemd

Конфигурация:

/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

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/ - путь к структуре файлов на сервере.

* на данный момент поддержки IPv6 для sv_downloadurl нет
* в рамках форка sv-downloadurl-ipv6 добавлена поддержка новой опции для server.cfg - sv_downloadurl_ipv6=«[IPv6]:port/path» позволяющая секурно загружать модели при подключении Yggdrasil

RESGen

Утилита используется для создания файла дополнительных зависимостей в формате .res для загрузки клиентом из сервера при инициализации карты.

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

Есть исходники и рабочая сборка для Linux.

Принцип работы

Извлекаем зависимости карты:

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/…

Мастер

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

pymaster

Официальный pymaster считается устаревшим, но силами сообщества в отдельных форках есть активность. Разработчики официальной версии обещают версию на Rust, но дата публикации не известна.

Для работы с Yggdrasil, рекомендуется версия от YGGverse, включающая в себя поддержку IPv6 и обновления протокола Xash3D.

pymaster - это Python реализация мастер-сервера HLMaster, в рамках проекта FWGS.

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

pymaster.py -i :: -p 27010

* в репозитории также есть пример конфигурации systemd

Чтобы pymaster начал отдавать игровые сервера клиентам, обе стороны должны быть скомпилированы или настроены на данный мастер-сервер.

В Xash3D исходники находятся в файле engine/common/netchan.h строки MASTERSERVER_ADR или в файле конфигурации /valve/xashcomm.lst
При использовании клиента с графическим интерфейсом, можно динамически указывать мастер сервер в консоли, командами listmasters/clearmasters/addmaster адрес:порт
Обновление типичных конфигураций valve - steamcomm.lst и valvecomm.lst игнорируется при запуске в оболочке Xash3D.

xash3d-master

xash3d-master (GitHub) - недавний релиз мастер сервера для Xash3D, написанного на языке Rust

Установка

git clone https://github.com/FWGS/xash3d-master.git && cd xash3d-master
cargo build --release
sudo install target/release/xash3d-master /usr/local/bin/xash3d-master
/etc/systemd/system/xash3d-master.service
[Unit]
After=network.target

[Service]
Type=simple
User=xash3d-master
Group=xash3d-master
ExecStart=/usr/local/bin/xash3d-master --ip xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
StandardOutput=file:///path/to/debug.log
StandardError=file:///path/to/error.log
# Restart=on-failure

[Install]
WantedBy=multi-user.target
  • перед запуском сервиса - открыть UDP порт 27010

XashMS

XashMS - асинхронный сервер для Xash3D с поддержкой IPv6 на языке C++

Боты

Чтобы оживить сервер и сделать ожидание игроков интереснее, в игру можно добавить ботов с помощью сторонних плагинов.

Bot Number 10

Самый простой способ - установка последней версии Bot Number 10.

Загружаем архив для Linux и распаковываем содержимое в корневую директорию с бинарником xash3d таким образом, чтобы директория bot была рядом с valve. Поскольку плагин являет собой расширение, он не перезаписывает файлы игры, и запускать сервер необходимо указав новый путь к директории игры:

xash3d -game bot

Важно учитывать, что при запуске из нестандартной директории, сервер будет отфильтрован большинством мастер серверов, в виду фильтрации по valve.
Чтобы решить эту проблему, можно:

  • сменить пути DLL в файле gameinfo.txt
  • скопировать содержимое директории bot в valve и перезапустить сервер без флага -game bot

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

bot.cfg
min_bots 1 # не ставить в 0, интерпретируется как false
max_bots 4

После запуска, настроенные в bot.cfg персонажи будут добавлены в игру. Плагин является частью проекта hlsdk-portable, при возникновении проблем, возможно потребуется собрать файл /valve/dlls/hl.so и заменить им оригинальный, хотя в случае с последней версией Steam - все работает без дополнительных действий.

Сборка из исходников

На сайте есть архив с исходниками, но последнюю версию можно собрать из репозитория с файлами 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 by YGGverse

Открытая модификация Bot Number 10 для сервера YGGverse

1.0.0

  • добавлена возможность установки min_bots=0 (PR #423)
  • респавн ботов с конфигурации bot.conf (PR #422)
  • поддержка дополнительных скинов

сборка

git clone --recursive https://github.com/YGGverse/hlsdk-portable.git
git checkout bot10-yggverse
cmake -B build -S .
cmake --build build

Есть бинарные релизы для более ранних систем.

Графити

В сетевой игре можно использовать графити, с помощью кнопки T. Изображение выбирается в настройках клиента, раздел «Multiplayer» - «Customize».

Чтобы создать свой логотип, изображение должно быть размером 64х64 пикселя, в палитре Grayscale и формате .BMP

Ниже рассмотрен пример обработки изображения PNG из коллекции hl-customs в редакторе GIMP:

1. Image → Scale Image → 64×64 / Quanlity: Linear
2. Layer → Transparency → Remove Alpha Channel
3. Colors → Components → Decompose
4. Colors → Invert (черный цвет считается прозрачным)
5. File → Export As.. → сохраняем по адресу /valve/logos/filename.bmp

Результат на данном примере будет иметь следующий вид

Следует заметить, что создание Ч/Б графики обусловлено возможностью выбора цвета в интерфейсе игры.

HL IPv6 Graffiti

Игровые сервера

Skunky

  • [300:dee4:d3c0:953b::2019]:27015 - 9 ботов, только Yggdrasil

P.S.

  • [202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:27015 - Yggdrasil & Mycelium
    • hl.ygg - alias for 202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148
    • skunky.hl.ygg - alias for 300:dee4:d3c0:953b::2019

YGGverse

Имеется открытая конфигурация сервера, можно вносить свои предложения или использовать для организации нового сервера.

Мастер сервера

  • [300:dee4:d3c0:953b::2019]:27010 - by lost+skunk
  • [202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:27010 by ps

Ссылки

Только авторизованные участники могут оставлять комментарии.
yggdrasil/games/half_life_on_xash3d.txt · Последнее изменение: 2025/08/15 23:17 — p.s.
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki